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 关键…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...