Java集合List详解(带脑图)
允许重复元素,有序。常见的实现类有 ArrayList
、LinkedList
、Vector
。
ArrayList
ArrayList
是在 Java 编程中常用的集合类之一,它提供了便捷的数组操作,并在动态性、灵活性和性能方面取得了平衡。如果需要频繁在中间插入和删除元素,或者需要在多线程环境中使用,可能需要考虑其他集合实现。
特点
1.动态大小: ArrayList
的大小是动态可变的,可以根据需要自动增加或缩小。这与 Vector
相似,但相对于 LinkedList
,它的随机访问效率更高。
2.随机访问高效: 由于 ArrayList
基于动态数组实现,可以通过索引直接访问元素,因此在需要频繁随机访问元素的场景下,ArrayList
的性能通常优于 LinkedList
。
3.适用于大部分场景: 在大多数情况下,ArrayList
是一个通用、高效的集合类。它适用于存储和随机访问元素,但不适用于在中间或开头频繁插入和删除元素的情况。
4.非同步: ArrayList
不是线程安全的,不支持多线程并发操作。如果需要在多线程环境中使用,可以考虑使用 Vector(这个比较落后了,所以就不提了)
或使用 Collections.synchronizedList
方法包装 ArrayList
。
使用方法
首先先引用,然后初始化。
import java.util.ArrayList;//引入ArrayList类public class Test01 {ArrayList<String> objectName = new ArrayList<>();//初始化
}
objectName:对象名。
ArrayList<String>:这<>里面的是泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
一点示范
import java.util.ArrayList;//引入ArrayList类public class Test01 {public static void main(String[] args) {ArrayList<String> objectName = new ArrayList<>();//初始化objectName.add("Changsha");//add()System.out.println(objectName);objectName.add("Shenyang");System.out.println(objectName);objectName.set(0,"Shanghai");//set()System.out.println(objectName);System.out.println(objectName.get(1));//get()objectName.remove(1);//remove()System.out.println(objectName);}
}
运行结果
用法表格
1 | add() | 将元素插入到指定位置的 arraylist 中 |
2 | addAll() | 添加集合中的所有元素到 arraylist 中 |
3 | clear() | 删除 arraylist 中的所有元素 |
4 | clone() | 复制一份 arraylist |
5 | contains() | 判断元素是否在 arraylist |
6 | get() | 通过索引值获取 arraylist 中的元素 |
7 | indexOf() | 返回 arraylist 中元素的索引值 |
8 | removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
9 | remove() | 删除 arraylist 里的单个元素 |
10 | size() | 返回 arraylist 里元素数量 |
11 | isEmpty() | 判断 arraylist 是否为空 |
12 | subList() | 截取部分 arraylist 的元素 |
13 | set() | 替换 arraylist 中指定索引的元素 |
14 | sort() | 对 arraylist 元素进行排序 |
15 | toArray() | 将 arraylist 转换为数组 |
16 | toString() | 将 arraylist 转换为字符串 |
17 | ensureCapacity() | 设置指定容量大小的 arraylist |
18 | lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
19 | retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
20 | containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
21 | trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
22 | removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
23 | replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
24 | removeIf() | 删除所有满足特定条件的 arraylist 元素 |
25 | forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |
LinkedList
特点
1.双向链表结构:这是它与ArrayList最主要的差别, LinkedList
的底层数据结构是双向链表,每个节点都包含对前一个和后一个元素的引用。
2.动态大小: 类似于 ArrayList
,LinkedList
的大小也是动态可变的,可以根据需要自动增加或缩小。
3.插入和删除效率高: 由于链表结构,LinkedList
在中间插入和删除元素的操作比 ArrayList
效率更高。因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。
4.非随机访问效率相对较低: 与 ArrayList
不同,LinkedList
的随机访问效率相对较低。如果需要频繁随机访问元素,ArrayList
可能更适合。
5.迭代效率: 在迭代时,LinkedList
的性能较差。由于访问节点需要跳跃指针,相比于数组的连续存储,会增加迭代的开销。
6.占用更多内存: 由于每个节点都需要存储额外的引用,相对于 ArrayList
,LinkedList
在内存占用上可能会更多。
7.非同步: LinkedList
也不是线程安全的,不支持多线程并发操作。如果需要在多线程环境中使用,可以考虑使用 Collections.synchronizedList
方法包装 LinkedList
。
8.特定场景的优势: 在某些特定的场景中,如实现栈、队列或双端队列等数据结构时,LinkedList
可能更为适用。
使用方法
同样是引用和初始化
import java.util.LinkedList;public class Test01 {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();}
}
linkedList:对象名
LinkedList<String>:这<>里面的是泛型数据类型,用于设置 linkedList的数据类型,只能为引用数据类型。
一些示范
import java.util.LinkedList;public class Test01 {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Apple");linkedList.add("Banana");linkedList.add("Orange");System.out.println(linkedList);
// 在指定位置插入元素linkedList.add(1, "Grapes");System.out.println(linkedList);//获取链表中的元素:String element = linkedList.get(0);System.out.println(element);//更新链表中的元素linkedList.set(0, "NewElement");System.out.println(linkedList);}
}
运行结果
常见用法
1 | linkedList.add("Element"); | 在链表末尾添加元素 |
2 | linkedList.add(index, "Element"); | 在指定位置插入元素 |
3 | linkedList.get(index); | 获取链表中的元素 |
4 | linkedList.set(index, "NewElement"); | 更新链表中的元素 |
5 | linkedList.remove(index); | 删除指定位置的元素 |
6 | int size = linkedList.size(); | 获取链表的大小 |
7 | linkedList.isEmpty(); | 判断链表是否为空 |
8 | linkedList.contains("Element"); | 查找元素是否存在 |
9 | linkedList.getFirst();linkedList.getLast(); | 获取第一个和最后一个元素 |
10 | linkedList.removeFirst(); linkedList.removeLast(); | 删除第一个和最后一个元素 |
11 | Iterator<String> iterator = linkedList.iterator(); while (iterator.hasNext()) { String element = iterator.next(); // 处理元素 } | 迭代器遍历链表 |
12 | ListIterator<String> iterator = linkedList.listIterator(linkedList.size()); while (iterator.hasPrevious()) { String element = iterator.previous(); // 处理元素 } | 反向遍历链表 |
ArrayList 和 LinkedList 的性能对比
- ArrayList:适合频繁的随机访问操作,时间复杂度为O(1)。但在中间插入或删除元素时,时间复杂度为O(n),因为需要移动后续元素。
- LinkedList:适合频繁的插入和删除操作,时间复杂度为O(1)。但随机访问元素时,时间复杂度为O(n),因为需要从头或尾遍历链表。
- 对时间和空间不了解的可以看时间复杂度与空间复杂度详解(曼波版)-CSDN博客
线程安全
- ArrayList和LinkedList都不是线程安全的。如果需要在多线程环境中使用,可以使用Collections.synchronizedList来包装它们:
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
- 或者使用CopyOnWriteArrayList,它是线程安全的List实现,适合读多写少的场景。
迭代器
- ArrayList和LinkedList都支持Iterator和ListIterator。ListIterator提供了双向遍历的能力,可以在遍历过程中修改列表。
ListIterator<String> iterator = list.listIterator();while (iterator.hasNext()) {String element = iterator.next();// 处理元素}
容量管理
- ArrayList在内部使用数组存储元素,当数组容量不足时会自动扩容。可以通过ensureCapacity(int minCapacity)方法来预先分配足够的容量,避免频繁扩容带来的性能开销。
ArrayList<String> list = new ArrayList<>();list.ensureCapacity(100); // 预先分配100个元素的容量
LinkedList 的特殊方法
- LinkedList实现了Deque接口,因此可以用作栈或队列。它提供了addFirst、addLast、removeFirst、removeLast等方法,可以方便地实现栈和队列的操作。
LinkedList<String> queue = new LinkedList<>();queue.addLast("A"); // 入队String first = queue.removeFirst(); // 出队
性能优化建议
- 如果需要频繁在列表中间插入或删除元素,优先选择LinkedList。
- 如果需要频繁随机访问元素,优先选择ArrayList。
- 如果列表大小固定且已知,可以使用Arrays.asList来创建不可变的列表,减少内存开销。
List<String> fixedList = Arrays.asList("A", "B", "C");
进一步优化与迭代方向
- 性能测试:在实际项目中,建议对ArrayList和LinkedList进行性能测试,根据具体场景选择最合适的集合类。
- 并发控制:如果需要在多线程环境中使用List,可以考虑使用CopyOnWriteArrayList或Collections.synchronizedList来保证线程安全。
- 内存优化:对于大数据量的列表,可以考虑使用ArrayList并预先分配足够的容量,避免频繁扩容带来的性能开销。
脑图
觉得不清晰文章顶部有资源可以下载
相关文章:

Java集合List详解(带脑图)
允许重复元素,有序。常见的实现类有 ArrayList、LinkedList、Vector。 ArrayList ArrayList 是在 Java 编程中常用的集合类之一,它提供了便捷的数组操作,并在动态性、灵活性和性能方面取得了平衡。如果需要频繁在中间插入和删除元素…...

[实验日志] VS Code 连接服务器上的 Python 解释器进行远程调试
目录 0. 前言 1. 环境 2. 准备工作 2.1 安装VS Code 2.2 安装插件 2.3 配置远程服务器 2.4 修改设置 2.5 打开远程调试窗口 3. 调试代码 3.1 输密码 3.2 打开服务器文件夹 3.3 配置Python环境 3.4 调试Python代码 补充:使用调试控制台,查看…...

(14)gdb 笔记(7):以日志记录的方式来调试多进程多线程程序,linux 命令 tail -f 实时跟踪日志
(44)以日志记录的方式来调试多进程多线程程序 : 这是老师的日志文件,可以用来模仿的模板: (45)实时追踪日志的 tail -f 命令: (46) 多种调试方法结合起来用 …...

Sentinel的安装和做限流的使用
一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…...

四柱预测学
图表 后天八卦 十二地支不仅代表了时间,还代表了方位。具体来说: 子:代表正北方丑寅:合起来代表东北方卯:代表正东方辰巳:合起来代表东南方午:代表正南方未申:合起来代表西南方酉:代表正西方戌亥:合起来代表西北方四季-五行-六神…...

【个人开发】macbook m1 Lora微调qwen大模型
本项目参考网上各类教程整理而成,为个人学习记录。 项目github源码地址:Lora微调大模型 项目中微调模型为:qwen/Qwen1.5-4B-Chat。 去年新发布的Qwen/Qwen2.5-3B-Instruct同样也适用。 微调步骤 step0: 环境准备 conda create --name fin…...

sqli-labs靶场实录(二): Advanced Injections
sqli-labs靶场实录: Advanced Injections Less21Less22Less23探测注入点 Less24Less25联合注入使用符号替代 Less25aLess26逻辑符号绕过and/or过滤双写and/or绕过 Less26aLess27Less27aLess28Less28aLess29Less30Less31Less32(宽字节注入)Less33Less34Le…...

Linux系统 环境变量
环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量,本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”,我们会更详细讲解;理解环境变量的全局…...

机器学习-线性回归(最大似然估计)
机器学习任务可以分为两类: 一类是样本的特征向量 𝒙 和标签 𝑦 之间存在未知的函数关系𝑦 h(𝒙),另一类是条件概率𝑝(𝑦|𝒙)服从某个未知分布。最小二乘法是属于第一类,…...

【信息系统项目管理师-案例真题】2017上半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】8 分【问题2】4 分【问题3】8 分【问题4】5 分试题二【问题1】10 分【问题2】8 分【问题3】6 分【问题4】5 分试题三【问题1】5 分【问题2】7 分【问题3】6 分【问题4】3 分试题一 阅读下列说明…...
CSP晋级组比赛生成文件夹与文件通用代码Python
快速生成文件夹与文件的脚本 import sys import osmyfiles sys.argv[1::] for f in myfiles:os.mkdir(f)os.system(f"touch {f}/{f}.in")os.system(f"touch {f}/{f}.out")os.system(f"touch {f}/{f}.cpp")with open("template.cpp",…...
正则表达式进阶(二)——零宽断言详解:\b \B \K \z \A
在正则表达式中,零宽断言是一种非常强大的工具,能够在不消费字符的情况下对匹配位置进行约束。除了环视(lookahead 和 lookbehind)以外,还有一些常用的零宽断言,它们用于处理边界、字符串的开头和结尾等特殊…...
Android 中实现 PDF 预览三种方式
目录 1. 使用第三方库 PdfRenderer(适用于 Android 5.0 及以上) 步骤:2. 使用第三方库 MuPDF步骤:3. 使用第三方库 PdfiumAndroid步骤: 1. 使用第三方库 PdfRenderer(适用于 Android 5.0 及以上)…...
尚硅谷课程【笔记】——大数据之Zookeeper【二】
课程视频:【尚硅谷Zookeeper教程】 四、Zookeeper实战 4.1分布式安装部署 1. 集群规划 在Hadoop102、Hadoop103和Hadoop104三个节点上部署Zookeeper 2. 解压安装 1)解压Zookeeper.tar.gz到指定目录 tar -zxvf zookeeper-3.7.2.tar.gz -C /opt/mod…...

CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发
CodeGPT IDEA DeepSeek,在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本,实测2022版IDEA无法获取到CodeGPT最新版插件。(在IDEA自带插件市场中搜不到,可以去官网搜索最新版本) ToolsVersionIntelliJ IDEA202…...

postgresql 游标(cursor)的使用
概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,因为一次性处理可能造成内存溢出。 另外我们可以定义函数返回游标类型变量,这是函数返回大数据集的有效方式,函数调用者…...
计算机组成原理——指令系统(六)
在时间的长河中,我们都是追梦人,脚下的每一步都在刻画未来的模样。无论世界如何变幻,心中的那团火焰都不应熄灭。它是你突破黑暗、迎接黎明的力量源泉。每一个不曾起舞的日子,都是对生命的辜负;每一次跌倒后的站起&…...

Python设计模式 - 原型模式
定义 原型模式是一种创建型设计模式,它可以通过复制现有对象来创建新对象,而不是直接实例化新的对象。 结构 抽象原型(Prototype):声明 clone() 方法,以便派生类实现克隆自身的能力。具体原型(…...

金和OA C6 DownLoadBgImage任意文件读取漏洞
金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统,主要应用于企业资源规划(ERP)、客户关系管理(CRM)以及办公自动化(OA)…...

【stm32学习】STM32F103实操primary(FlyMCU)
github插入图片实在是太难用了,暂时懒得学就先用CSDN吧hh 一、在设备管理器下,找到单片机,并检查与FlyMCU-搜索端口 显示的是否一致 二、在搜索串口右面的栏里选中该Port,波特率选中115200 三、选择文件夹中的.hex文件࿰…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...