Java的list集合总结

在编程语言中,我们必然少不了存储数据的容器,虽然我们有数组,但是数组是连续的开辟处一块连续的内存空间,我们的数据过大会无法存储完,数据量小,会浪费空间,所以我们需要使用集合存储数据,而在Java中list和set是我们最常用的集合,它们都属于Collection接口的子接口,那么我们下面分析其共同点,和其对应的数据结构。

1.list接口:

        首先list接口,作为单列集合(只存储值),它允许值重复(值可以不唯一)。它的实现类有Arraylist,linkedList,Vector

        从线程安全的角度,我们逐个分析:

        线程不安全:

                ArrayList:

                1.数据结构:Object数组,观察源码可知,其底层逻辑还是以Object,数组存放数据

                2.扩容方式:

                        首先我们需要知道,集合比数组的优势之一就是其内存储空间可变化,那么它是如何变化的,而且它的数据结构是一个Object数组,但数组并没有完成初始化,又在什么时候完成初始化。且容量不足时又如何扩容呢。它们都与其内部定义的成员变量(默认数组),以及无参,有参构造方法,add()方法有关,下面我们先观察源码(扩容的源码没有展示)

                内部定义的成员变量与数组:

                无参构造方法   源码:

                有参构造方法  源码:

                add()方法:

                结论:无参构造方法:观察源码可知,它的构造方法是在内部将默认的数组初始化,但长度为0,当我们调用add()方法添加第一个元素时,它就会调用内部的参数,将数组的长度扩容为10,当容量不足时,就会以现数组容量的1.5倍进行扩容。
                        有参构造方法:观察源码可知,其有参构造方法是根据参数,将内部数组初始化长度(适用于预估数据量创建),当容量不足时,我们的数组容量也是以现数组容量的1.5倍进行扩容
                使用场景:相对来说,其内部存储空间连续,格局下标获取元素,适合查找,遍历,
                        不适合插入,删除,当删除和插入到中间或者头部元素时,其需要复制数组内容,再删除或插入,消耗性能。包含调用add的重载方法,根据下标插入等

        LinkedList:

                1.数据结构:观察源码可知,其内部为一条双向的链表

    

                2.扩容方式:观察源码可知,当我们调用add方法添加元素时,其就会动态的添加一个节点,链表动态的扩容,并且如果是add()方法,或者 addLast()方法添加到链表尾部(尾插法),如果是addFirst()方法就是动态添加到头部(头插法)。

                此类为我们提供了不同参数的add方法,也可根据参数,动态的将元素添加到任意位置

        

                使用场景:相对来说插入,删除效率高,查找效率低,但是查找头元素,尾元素效率极高。

         线程安全:Vector,Stack

                Vector:

                    1.数据结构:

                        无参构造,和有参构造方法

                结论:观察源码可知,其内部也是数组
                    2.扩容方式:

                                观察上述源码,我们可知

                                无参构造,或单个参数有参构造:其内部数组初始容量为10,当容量不足时,我们按数组现有容量的两倍进行扩容。

                                两个参数有参构造:

                                参数一:设定了数组初始容量的值,参数二:规定了数组容量扩容值。

                    3.线程安全: 观察其内部的多个方法,我们可知,其内部不同的方法都加上了synchronized,锁所以保证线程安全。

                                          Stack:观察源码可知,Stack类继承自Vector类,Stack(栈)本身就是一种数据存储结构,其最大特点就是先进后出FILO。

最后,list接口的实现类包含了多种,还有CopyOnWriterArrayList等,在此就不逐一介绍了。

                     

                        

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3250261.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

前端JS特效第46集:js-实现响应式节庆活动砸金蛋效果

js-实现响应式节庆活动砸金蛋效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>响应式节庆活动砸金蛋…

redis持久化RDB(仅供自己参考)

&#xff08;1&#xff09;save命令&#xff1a;是直接占用主线程来执行持久化的&#xff08;因为redis是单线程的&#xff0c;如果执行save命令&#xff0c;则其他命令&#xff0c;无论查询还是怎么的都被阻塞了&#xff09; &#xff08;2&#xff09;bgsave命令&#xff1a…

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…

《基于 Kafka + Quartz 实现时限质控方案》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

OpenCv 如何在 Java 中使用

Java 项目引入 OpenCv 环境准备OpenCv介绍下载Maven 安装动态链接库 完成 环境准备 JDK 8 OpenCv 4.0.0 Maven 3.9 Windows 11 OpenCv 介绍 OpenCV&#xff08;开源计算机视觉库&#xff09;是一个功能强大的计算机视觉和机器学习库。它提供了广泛的工具和算法&#xff0c;用…

jquery实现文字点选验证码

jquery实现文字点选验证码 git地址&#xff1a;点击获取源码 一、功能说明&#xff08;文字点选验证码&#xff09; 词组库内存在大量3~6字随机词组&#xff0c;从词组库内随机找出一组词组&#xff0c;随机展现在显示区点击按钮&#xff0c;弹出验证码区域将词组内的随机数量…

4. docker镜像、Dockerfile

docker镜像、Dockerfile 一、docker镜像1、镜像介绍2、镜像核心技术 二、Dockerfile定制镜像1、Dockerfile使用流程1.1 编写Dockerfile1.2、构建镜像1.3 创建容器测试镜像定制操作 2、Dockerfile常用指令 一、docker镜像 1、镜像介绍 分层的文件系统 优势&#xff1a;节省空间…

vue3前端开发-小兔鲜项目-封装一下产品展示模块组件

vue3前端开发-小兔鲜项目-封装一下产品展示模块组件&#xff01;因为这种产品展示信息的模块组件&#xff0c;后面我还会在其他的页面内反复使用到&#xff0c;所以&#xff0c;使用模块化开发的思路&#xff0c;把它单独设计成一个组件&#xff0c;这样可以代码复用。以后在其…

一建备考,五步形成闭环学习!

一建备考从7月份到考前是大部分人焦虑的时候&#xff0c;因为基础阶段结束&#xff0c;开始成套做真题了&#xff0c;第一遍做真题很多人分数都不太理想&#xff0c;很多同学直接失去信心&#xff0c;开始emo&#xff0c;这都是只听课不做题的结果。 现在很多同学都是这种情况…

STM32智能家居电力管理系统教程

目录 引言环境准备智能家居电力管理系统基础代码实现&#xff1a;实现智能家居电力管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居电…

【单片机毕业设计选题24072】-基于单片机的智能停车场管理系统

系统功能: 1.根据RFID卡卡号判断新老用户&#xff0c;老用户不计费直接放行&#xff0c;新用户放行时显示计费结果 2.显示屏显示车位剩余数量 3.检测车位有车亮红灯&#xff0c;无车亮绿灯&#xff0c;能够实现车位诱导 5.车辆出停车场时&#xff0c;能根据停车时间计算停车…

【香橙派】Orange pi AIpro开发板使用之普通照片转换为卡通

前言 最近有幸收到一份新款 OrangePi AIpro 开发板&#xff0c;之前手里也捣鼓过一些板子&#xff0c;这次尝试从零开始部署一个简单的后端服务。OrangePi AIpro 采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;可配16GB内存容量&#xff0c;各种复杂应…

Facebook Dating:社交平台的约会新体验

随着社交媒体的普及和技术的发展&#xff0c;传统的社交方式正在经历革新&#xff0c;尤其是在约会这个领域。Facebook作为全球领先的社交平台&#xff0c;推出了Facebook Dating&#xff0c;旨在为用户提供一个全新的约会体验。本文将探讨Facebook Dating如何重新定义社交平台…

c语言题目之打印单身狗

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 首先这里先了解两个有关于位操作符异或的知识点 &#xff0c;异或操作符的规则是相同为0&#xff0c;相异为1 。 通过上面我们可以得…

双非一本嵌入式方向怎么学?

双非一本&#xff08;非“985”和“211”工程重点建设的本科院校&#xff09;的学生在学习嵌入式方向时&#xff0c;可以通过以下步骤和策略来系统地学习和提升自己。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学…

哈喽GPT-4o,程序员如何通过GPT-4o保护自己的合法权益

目录 一、法律研究Prompt&#xff1a;派遣合同和劳务外包合同有什么区别&#xff1f;详细说一下在被裁员时的区别&#xff1f; 二、法律条文检索Prompt&#xff1a;检索《劳动合同法》&#xff0c;以下情况属于第几条&#xff0c;如果公司进行技能考试&#xff0c;并以技能考试…

嵌入式物联网在医疗行业中的应用——案例分析

作者主页: 知孤云出岫 目录 嵌入式物联网在医疗行业中的应用——案例分析引言1. 智能病房监控1.1 实时患者监控系统 2. 智能医疗设备管理2.1 设备使用跟踪与维护 3. 智能药物管理3.1 药物分配与跟踪 4. 智能远程医疗4.1 远程患者监控与诊断 总结 嵌入式物联网在医疗行业中的应…

Rust Result 与可恢复的错误

Result 与可恢复的错误 大部分错误并没有严重到需要程序完全停止执行。有时&#xff0c;一个函数会因为一个容易理解并做出反应的原因失败。例如&#xff0c;如果因为打开一个并不存在的文件而失败&#xff0c;此时我们可能想要创建这个文件&#xff0c;而不是终止进程。 回忆…

3112. 访问消失节点的最少时间 Medium

给你一个二维数组 edges 表示一个 n 个点的无向图&#xff0c;其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear &#xff0c;其中 disappear[i] 表示节点 i 从图中消失的时间点&#xff0…

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…