Java 23 集合框架详解:ArrayList、LinkedList、Vector
📚 Java 23 集合框架详解:ArrayList
、LinkedList
、Vector
在 Java 集合框架中,ArrayList
、LinkedList
和 Vector
是三种最常用的 List
接口实现类。它们都可以存储有序的、可重复的元素,但它们在 底层实现、性能 和 多线程安全 等方面存在显著差异。
本文将从 使用案例、优化方案 和 多线程优化 等方面详细解析这三种集合的实现原理及适用场景。
📖 1. ArrayList
、LinkedList
、Vector
概述
集合类型 | 底层实现 | 线程安全 | 性能特点 | 适用场景 |
---|---|---|---|---|
ArrayList | 动态数组 | 否 | 读操作快,增删操作慢 | 适合 读操作频繁 的场景 |
LinkedList | 双向链表 | 否 | 插入/删除操作快,随机访问慢 | 适合 插入/删除操作频繁 的场景 |
Vector | 动态数组(线程安全) | 是 | 同步开销大,性能较低 | 适合 多线程环境,但不推荐使用 |
🧩 2. ArrayList
详解
✅ 2.1 特点
- 基于动态数组实现,初始容量为 10,容量不足时会自动扩容。
- 支持随机访问,
get()
和set()
操作时间复杂度为 O(1)。 - 线程不安全,需要在多线程环境中手动同步。
🔧 2.2 使用案例
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {// 创建一个 ArrayListArrayList<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");// 遍历names.forEach(System.out::println);// 获取元素System.out.println("First Element: " + names.get(0));// 修改元素names.set(1, "David");// 删除元素names.remove("Charlie");// 遍历names.forEach(System.out::println);}
}
🛠 2.3 优化方案
- 指定初始容量,减少扩容开销:
ArrayList<String> list = new ArrayList<>(100);
- 避免频繁删除或插入操作,如果有大量插入/删除操作,建议使用
LinkedList
。
⚠️ 2.4 多线程优化
ArrayList
是线程不安全的,可以通过以下方式实现线程安全:
✅ 方案 1:使用 Collections.synchronizedList()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class SynchronizedArrayListExample {public static void main(String[] args) {List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());synchronizedList.add("Alice");synchronizedList.add("Bob");synchronized (synchronizedList) {synchronizedList.forEach(System.out::println);}}
}
✅ 方案 2:使用 CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListExample {public static void main(String[] args) {CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();list.add("Alice");list.add("Bob");list.forEach(System.out::println);}
}
🧩 3. LinkedList
详解
✅ 3.1 特点
- 基于双向链表实现,每个节点包含 数据和两个指针。
- 插入和删除操作快,但随机访问性能较差。
- 支持双端队列(Deque)操作,可用作 队列(Queue) 或 栈(Stack)。
🔧 3.2 使用案例
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 创建一个 LinkedListLinkedList<String> list = new LinkedList<>();list.add("Alice");list.add("Bob");list.add("Charlie");// 添加到头部和尾部list.addFirst("First");list.addLast("Last");// 获取头部和尾部元素System.out.println("First Element: " + list.getFirst());System.out.println("Last Element: " + list.getLast());// 删除头部和尾部元素list.removeFirst();list.removeLast();// 遍历list.forEach(System.out::println);}
}
🛠 3.3 优化方案
- 避免随机访问,因为
get()
操作的时间复杂度为 O(n)。 - 优先使用
ArrayList
,除非有大量的插入/删除操作。
⚠️ 3.4 多线程优化
LinkedList
是线程不安全的,在多线程环境中需要手动同步。
✅ 方案:使用 Collections.synchronizedList()
import java.util.LinkedList;
import java.util.Collections;
import java.util.List;public class SynchronizedLinkedListExample {public static void main(String[] args) {List<String> synchronizedList = Collections.synchronizedList(new LinkedList<>());synchronizedList.add("Alice");synchronizedList.add("Bob");synchronized (synchronizedList) {synchronizedList.forEach(System.out::println);}}
}
🧩 4. Vector
详解
✅ 4.1 特点
- 线程安全的动态数组,所有方法都使用了
synchronized
关键字。 - 性能较低,因为同步开销大。
- 不推荐使用,在多线程环境下建议使用
CopyOnWriteArrayList
。
🔧 4.2 使用案例
import java.util.Vector;public class VectorExample {public static void main(String[] args) {// 创建一个 VectorVector<String> vector = new Vector<>();vector.add("Alice");vector.add("Bob");vector.add("Charlie");// 遍历vector.forEach(System.out::println);// 获取元素System.out.println("First Element: " + vector.get(0));// 修改元素vector.set(1, "David");// 删除元素vector.remove("Charlie");// 遍历vector.forEach(System.out::println);}
}
🛠 4.3 优化方案
- 避免使用
Vector
,改用ArrayList
或CopyOnWriteArrayList
。 - 如果必须使用线程安全的集合,推荐使用
CopyOnWriteArrayList
。
🔄 5. 三者对比总结
特性 | ArrayList | LinkedList | Vector |
---|---|---|---|
底层实现 | 动态数组 | 双向链表 | 动态数组 |
线程安全 | 否 | 否 | 是 |
随机访问性能 | 高 | 低 | 高 |
插入/删除性能 | 低 | 高 | 低 |
适用场景 | 读操作频繁 | 插入/删除操作频繁 | 多线程环境(不推荐) |
⚙️ 6. 总结与推荐
ArrayList
是最常用的集合类,适用于 读操作频繁 的场景。LinkedList
适用于 插入/删除操作频繁 的场景。Vector
是线程安全的集合,但 不推荐使用,可用CopyOnWriteArrayList
替代。
在实际开发中,推荐选择 ArrayList
和 CopyOnWriteArrayList
。
相关文章:
Java 23 集合框架详解:ArrayList、LinkedList、Vector
📚 Java 23 集合框架详解:ArrayList、LinkedList、Vector 在 Java 集合框架中,ArrayList、LinkedList 和 Vector 是三种最常用的 List 接口实现类。它们都可以存储有序的、可重复的元素,但它们在 底层实现、性能 和 多线程安全 等…...
03、MySQL安全管理和特性解析(DBA运维专用)
03、MySQL安全管理和特性解析 本节主要讲MySQL的安全管理、角色使用、特定场景下的数据库对象、各版本特性以及存储引擎 目录 03、MySQL安全管理和特性解析 1、 用户和权限管理 2、 MySQL角色管理 3、 MySQL密码管理 4、 用户资源限制 5、 忘记root密码处理办法 6、 SQ…...
创建型模式5.单例模式
创建型模式 工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern)单例模式(Singleto…...

用户界面软件02
基于表单的用户界面 在“基于表单的用户界面”里面,用户开始时选中某个业务处理(模块),然后应用程序就使用一系列的表单来引导用户完成整个处理过程。大型机系统上的大部分用户界面都是这样子的。[Cok97]中有更为详细的讨论。 面…...
VTK 鼠标+键盘重构
1、鼠标事件 如果有鼠标事件处理等相应的需求,可以重写该事件。 void OnMouseMove() override; //鼠标移动事件 void OnLeftButtonDown() override;//左键按下事件 void OnLeftButtonUp() override;//左键抬起事件 void OnMiddleButtonDown() override;//滚轮按下事件 …...
go语言处理JSON数据详解
一、结构体与json之间的转换 Go语言处理JSON数据通常涉及到将JSON数据解析成Go结构体,或者将Go结构体序列化为JSON格式。Go提供了内置的encoding/json包来实现这些操作。下面详细介绍如何在Go中处理JSON数据。 1. Go结构体与JSON映射 Go语言的encoding/json包可以将JSON数据…...
基于gin一个还算比较优雅的controller实现
看了两天时间的go,对于go的编码风格还不是很了解,但是了解到go并未有Java那样成体系的编码风格规范,所以自己浅尝试了一下,风格无对错,欢迎交流讨论~ controller层: package …...

PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目,旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本,还能保留公式、图表、目…...

Python编程实例-特征向量与特征值编程实现
特征向量与特征值编程实现 文章目录 特征向量与特征值编程实现1、什么是特征向量2、特征向量背后的直觉3、为什么特征向量很重要?4、如何计算特征向量?4、特征向量Python实现5、可视化特征向量6、总结线性代数是许多高级数学概念的基石,广泛应用于数据科学、机器学习、计算机…...
Vue3-跨层组件通信Provide/Inject机制详解
Vue 3 中的 Provide 和 Inject 机制是专为跨层级传递数据而设计的,适用于祖先组件和后代组件之间的通信。与props 和 emits 不同,Provide/Inject 可以跨越多个层级进行数据传递,而不需要逐层传递。 1. Provide provide 是一个在祖先组件中提…...
Linux Jar包定时重启脚本,按最新时间的Jar包启动
Linux Jar包定时重启脚本,按最新时间的Jar包启动 jar包按时间顺序命名如下: park-system-1.1.0-SNAPSHOT_20210101.jar park-system-1.1.0-SNAPSHOT_20210402.jar park-system-1.1.0-SNAPSHOT_20220520.jar 则该脚本默认启动时间最大的一个:park-system-1.1.0-SNAPSHOT_2022…...

HTML5实现好看的博客网站、通用大作业网页模板源码
HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码,博客网站源码,HTML模板源码࿰…...

掌握RabbitMQ:全面知识点汇总与实践指南
前言 RabbitMQ 是基于 AMQP 高级消息队列协议的消息队列技术。 特点:它通过发布/订阅模型,实现了服务间的高度解耦。因为消费者不需要确保提供者的存在。 作用:服务间异步通信;顺序消费;定时任务;请求削…...

go如何从入门进阶到高级
针对Go语言的学习,不同阶段应采取不同的学习方式,以达到最佳效果.本文将Go的学习分为入门、实战、进阶三个阶段,下面分别详细介绍 一、社区 Go语言中文网 作为专注于Go语言学习与推广的平台,Go语言中文网为开发者提供了丰富的中…...
在环境冲突情况下调整优先级以解决ROS Catkin构建中缺少模块的问题【ubuntu20.04】
在机器人操作系统(ROS)的开发过程中,构建工作空间时遇到各种依赖性问题是常见的挑战之一。尤其是在多Python环境共存的情况下,环境变量的冲突往往导致诸如缺少empy模块等错误。本文将详细介绍在ROS Noetic与Anaconda Python环境共…...

github 个人主页配置
Guthub 个人主页 (官方称呼是 profile)可以展示很多有用的信息,例如添加一个首页被访问次数的计数器,一个被 Star 与 Commit 的概览信息,以及各种技能标签,设备标签等,还可以利用 wakatime 显示…...
STM32-笔记30-编程实现esp8266联网功能
串口2连接ESP8266模块 复制项目文件34-ESP8266串口间的通信 重命名为35-编程实现ESP8266联网功能 打开项目文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "esp8266.h"…...

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln
目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考,oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场,主要考察 nmap的使用已经是否会看输出,以及是否会通过应用查找对应漏…...

《机器学习》——随机森林
文章目录 什么是随机森林?随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据,切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林? -随…...

指代消解:自然语言处理中的核心任务与技术进展
目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解:跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型(EPASE) 4. 应用场景与前景展望4.1 关键…...

rknn优化教程(一)
文章目录 1. 前述2. 优化思想2.1 实时帧率2.2 多线程处理2.2.1 排序2.2.2 批量处理2.2.3 队列 2.3 进一步优化 3. 代码 1. 前述 OK,铺垫了很久的rknn优化,终于开始写了。为什么要优化呢?当然是我们的使用遇到了瓶颈,要么使用的时…...

机器学习KNN算法全解析:从原理到实战
大家好!今天我们来聊聊机器学习中的"懒人算法"——KNN(K-Nearest Neighbors,K近邻)算法。这个算法就像个"墙头草",它不学习模型参数,而是直接根据邻居的"投票"来做决策&…...

单片机的低功耗模式
什么是低功耗? STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...

Grafana-ECharts应用讲解(玫瑰图示例)
工具: MySQL 数据库 MySQL Workbench 数据库管理工具(方便编辑数据) Grafana v11.5.2 Business Charts 6.6(原 Echarts插件) 安装 安装 MySQL社区版安装 MySQL Workbench安装 Grafana在 Grafana 插件中搜索 Business Charts 进行安装以上安装步骤网上教程很多,自行搜…...

Python训练营-Day22-Titanic - Machine Learning from Disaster
Description linkkeyboard_arrow_up 👋🛳️ Ahoy, welcome to Kaggle! You’re in the right place. This is the legendary Titanic ML competition – the best, first challenge for you to dive into ML competitions and familiarize yourself w…...

Windows平台RTSP/RTMP播放器C#接入详解
大牛直播SDK在Windows平台下的RTSP、RTMP播放器模块,基于自研高性能内核,具备极高的稳定性与行业领先的超低延迟表现。相比传统基于FFmpeg或VLC的播放器实现,SmartPlayer不仅支持RTSP TCP/UDP自动切换、401鉴权、断网重连等网络复杂场景自适应…...

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo
引言 小黑黑通过探索langchain源码,设计了一个关于agent使用工具的一个简化版小demo(代码可以跑通),主要流程: 1.问题输入给大模型。 2.大模型进行思考,输出需要执行的action和相关思考信息。 3.通过代理&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)
低层协议(Low Level Protocol, LLP)详细解析 1. 低层协议(Low Level Protocol, LLP)核心特性 包基础 :基于字节的包协议,支持 短包 (32位)和 长包 (可变长度࿰…...
湖北理元理律师事务所:债务优化中的民生保障实践
在债务纠纷数量年增21%(2023年最高人民法院数据)的背景下,法律服务机构如何平衡债务清偿与民生保障,成为行业重要课题。湖北理元理律师事务所通过“法律金融心理”三维服务模式,探索出一条可持续的债务化解路径。 一、…...

Appium+python自动化(十二)- Android UIAutomator
Android团队在4.1版本(API 16)中推出了一款全新的UI自动化测试工具UiAutomator,用来帮助开发人员更有效率的完成App的Debug工作,同时对于测试人员也是一大福音,为什么这么说呢? UiAutomator提供了以下两种…...