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 关键…...
Windows系统字体自定义神器:No!! MeiryoUI 5分钟上手指南
Windows系统字体自定义神器:No!! MeiryoUI 5分钟上手指南 【免费下载链接】noMeiryoUI No!! MeiryoUI is Windows system font setting tool on Windows 8.1/10/11. 项目地址: https://gitcode.com/gh_mirrors/no/noMeiryoUI 还在为Windows 8.1/10/11单调的系…...
基于itof相机的牛只三维重建
基于对iToF相机技术特性和畜牧业三维重建需求的综合分析,本报告提出了一套完整的多iToF相机牛只三维重建系统方案。该方案针对牛只体型测量、健康监测和行为分析等应用场景,从硬件选型、系统架构、算法优化到环境适应性等多个维度进行设计,能够在复杂牧场环境中实现高精度、…...
Boost库中的int128_t:高精度计算的实战指南
1. 为什么需要int128_t? 在C开发中,我们经常会遇到需要处理超大整数的情况。比如金融领域的金额计算、密码学中的大数运算、科学计算中的精确模拟等场景。传统的64位整数(long long)最大只能表示2^63-1(约9.210^18&am…...
别再死记硬背了!用Python的math库5分钟搞定角度与弧度换算(附代码示例)
Python数学实战:角度与弧度转换的高效编程指南 在游戏开发、计算机图形学和科学计算领域,角度与弧度的转换是每个程序员都会遇到的基础问题。记得我第一次尝试用Python编写一个简单的2D旋转动画时,就因为混淆了这两种单位导致图形旋转角度完全…...
如何永久保存微信聊天记录?WeChatMsg完整指南让记忆永不丢失
如何永久保存微信聊天记录?WeChatMsg完整指南让记忆永不丢失 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...
VibePaper测了我的脑内小剧场:它偷走了我的分镜灵魂
VibePaper测了我的脑内小剧场:它在30秒里偷走了我的分镜灵魂事情是这样的—— 我对着 VibePaper 说了一句:“一个男人在梦里反复推开同一扇门,每次门后的世界都不一样。” 然后它用了不到30秒,还给我: 4个分镜图 2段动…...
鸿蒙4.0和Android 12上,为什么你的App拿不到真实蓝牙MAC地址了?一个老需求的适配踩坑记
鸿蒙4.0与Android 12蓝牙权限适配实战:从虚拟地址到设备绑定的完整解决方案 当智能家居App弹出"设备绑定失败"提示时,作为开发者的你是否意识到这背后隐藏着从Android 10到鸿蒙4.0长达四年的隐私保护演进史?本文将带你穿越六个系统…...
STM32F103片内Flash读写避坑指南:CubeMX配置虽简单,但这几个细节错了就HardFault
STM32F103片内Flash读写避坑指南:从硬件机制到实战优化 第一次在项目中尝试使用STM32片内Flash存储设备运行日志时,系统每隔几天就会莫名其妙死机。通过逻辑分析仪抓取异常时刻的波形,发现每次HardFault都发生在Flash写入操作后的20μs内。这…...
多租户下的系统业务开发过程探讨俚
一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...
Qwen3-Reranker-4B部署教程:适配A10/A100/V100的GPU算力优化配置
Qwen3-Reranker-4B部署教程:适配A10/A100/V100的GPU算力优化配置 本文手把手教你如何在A10/A100/V100等主流GPU上部署Qwen3-Reranker-4B模型,从环境准备到服务调用,提供完整的优化配置方案。 1. 认识Qwen3-Reranker-4B模型 Qwen3-Reranker-4…...
