马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
📚 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) {
- // 创建一个 ArrayList
- ArrayList<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) {
- // 创建一个 LinkedList
- LinkedList<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) {
- // 创建一个 Vector
- Vector<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. 三者对比总结
特性ArrayListLinkedListVector底层实现动态数组双向链表动态数组线程安全否否是随机访问性能高低高插入/删除性能低高低实用场景读利用频仍插入/删除利用频仍多线程情况(不保举) ⚙️ 6. 总结与保举
- ArrayList 是最常用的聚集类,实用于 读利用频仍 的场景。
- LinkedList 实用于 插入/删除利用频仍 的场景。
- Vector 是线程安全的聚集,但 不保举利用,可用 CopyOnWriteArrayList 更换。
在现实开发中,保举选择 ArrayList 和 CopyOnWriteArrayList。
|