Java 23 集合框架详解:ArrayList、LinkedList、Vector

📚 Java 23 集合框架详解:ArrayListLinkedListVector

在 Java 集合框架中,ArrayListLinkedListVector 是三种最常用的 List 接口实现类 。它们都可以存储有序的、可重复的元素,但它们在 底层实现性能多线程安全 等方面存在显著差异。

本文将从 使用案例优化方案多线程优化 等方面详细解析这三种集合的实现原理及适用场景。


📖 1. ArrayListLinkedListVector 概述

集合类型 底层实现 线程安全 性能特点 适用场景
ArrayList 动态数组 读操作快,增删操作慢 适合 读操作频繁 的场景
LinkedList 双向链表 插入/删除操作快,随机访问慢 适合 插入/删除操作频繁 的场景
Vector 动态数组(线程安全) 同步开销大,性能较低 适合 多线程环境,但不推荐使用

🧩 2. ArrayList 详解

2.1 特点

  • 基于动态数组实现,初始容量为 10,容量不足时会自动扩容。
  • 支持随机访问get()set() 操作时间复杂度为 O(1)
  • 线程不安全,需要在多线程环境中手动同步。

🔧 2.2 使用案例

java 复制代码
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 优化方案

  1. 指定初始容量 ,减少扩容开销:

    java 复制代码
    ArrayList<String> list = new ArrayList<>(100);
  2. 避免频繁删除或插入操作 ,如果有大量插入/删除操作,建议使用 LinkedList


⚠️ 2.4 多线程优化

  • ArrayList 是线程不安全的,可以通过以下方式实现线程安全:
方案 1:使用 Collections.synchronizedList()
java 复制代码
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
java 复制代码
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 使用案例

java 复制代码
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 优化方案

  1. 避免随机访问 ,因为 get() 操作的时间复杂度为 O(n)
  2. 优先使用 ArrayList,除非有大量的插入/删除操作。

⚠️ 3.4 多线程优化

  • LinkedList 是线程不安全的,在多线程环境中需要手动同步。
方案:使用 Collections.synchronizedList()
java 复制代码
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 使用案例

java 复制代码
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 优化方案

  1. 避免使用 Vector ,改用 ArrayListCopyOnWriteArrayList
  2. 如果必须使用线程安全的集合,推荐使用 CopyOnWriteArrayList

🔄 5. 三者对比总结

特性 ArrayList LinkedList Vector
底层实现 动态数组 双向链表 动态数组
线程安全
随机访问性能
插入/删除性能
适用场景 读操作频繁 插入/删除操作频繁 多线程环境(不推荐)

⚙️ 6. 总结与推荐

  1. ArrayList 是最常用的集合类,适用于 读操作频繁 的场景。
  2. LinkedList 适用于 插入/删除操作频繁 的场景。
  3. Vector 是线程安全的集合,但 不推荐使用 ,可用 CopyOnWriteArrayList 替代。

在实际开发中,推荐选择 ArrayListCopyOnWriteArrayList

相关推荐
阿珊和她的猫26 分钟前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234173 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~3 小时前
C#---StopWatch类
开发语言·c#
桦说编程5 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen5 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研5 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员6 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋6 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO6 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端