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文件࿰…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
