一、List 集合概述
List 是 Java 集合框架中 有序、可重复 的接口,继承自 Collection,允许通过索引访问元素。其核心实现类包括 ArrayList、LinkedList 和 Vector,各有不同的底层结构和适用场景。
二、核心实现类详解
- ArrayList
-
底层结构 :动态数组(
Object[]),支持自动扩容。 -
核心特性:
- 访问效率 :按索引访问快(时间复杂度
O(1)),适合随机访问。 - 增删效率 :尾部增删快(
O(1)),中间增删慢(需移动元素,O(n))。 - 线程安全 :非线程安全,多线程环境需手动同步(如
Collections.synchronizedList())。 - 内存占用:较低(仅存储数据,无额外指针开销)。
- 访问效率 :按索引访问快(时间复杂度
-
常用方法:
ArrayList<String> list = new ArrayList<>(); list.add("元素"); // 尾部添加 list.add(1, "插入元素"); // 指定索引插入 list.set(0, "替换元素"); // 替换指定索引元素 list.get(0); // 获取索引元素 list.remove(0); // 按索引删除 list.remove("元素"); // 按值删除 list.contains("元素"); // 判断是否包含 list.size(); // 获取元素数量 list.clear(); // 清空集合 -
遍历方式:
- 普通 for 循环(适合随机访问);
- 增强 for 循环(简洁);
forEach方法(Lambda 表达式)。
-
适用场景:大量读操作、随机访问频繁,元素增删较少的场景(如数据展示、查询结果存储)。
- LinkedList
-
底层结构:双向链表,每个节点存储数据及前后节点引用。
-
核心特性:
- 访问效率 :按索引访问慢(需遍历链表,
O(n)),不适合随机访问。 - 增删效率 :首尾增删快(
O(1)),中间增删只需修改指针(O(n),主要耗时在遍历定位)。 - 线程安全:非线程安全。
- 内存占用:较高(需额外存储前后节点指针)。
- 访问效率 :按索引访问慢(需遍历链表,
-
特有方法 (实现
Deque接口,支持队列 / 栈操作):LinkedList<String> list = new LinkedList<>(); list.addFirst("首元素"); // 头部添加 list.addLast("尾元素"); // 尾部添加 list.getFirst(); // 获取首元素(空表抛异常) list.getLast(); // 获取尾元素(空表抛异常) list.peekFirst(); // 安全获取首元素(空表返回 null) list.peekLast(); // 安全获取尾元素(空表返回 null) list.removeFirst(); // 删除首元素(空表抛异常) list.removeLast(); // 删除尾元素(空表抛异常) list.pollFirst(); // 安全删除首元素(空表返回 null) -
遍历方式:
- 增强 for 循环(推荐);
- 迭代器
Iterator(支持边遍历边删除,避免并发异常); - 逆序迭代器
descendingIterator()(从尾到头遍历)。
-
适用场景:频繁在首尾或中间位置增删元素的场景(如队列、栈、链表结构模拟)。
- Vector(不推荐新项目使用)
-
底层结构 :动态数组(
Object[]),早期线程安全实现。 -
核心特性:
- 线程安全 :所有方法用
synchronized修饰,保证多线程安全,但性能较低。 - 扩容机制:默认初始容量 10,满容后扩容为原容量的 2 倍(ArrayList 为 1.5 倍)。
- 功能:与 ArrayList 类似,但方法加锁导致单线程性能差。
- 线程安全 :所有方法用
-
常用方法 :与 ArrayList 基本一致,额外支持
Enumeration遍历(遗留接口)。 -
适用场景 :需线程安全的多线程场景(现多被
ArrayList + Collections.synchronizedList()或CopyOnWriteArrayList替代)。
三、三大实现类对比表
| 特性 | ArrayList | LinkedList | Vector |
|---|---|---|---|
| 底层结构 | 动态数组 | 双向链表 | 动态数组 |
| 随机访问效率 | 快(O(1)) |
慢(O(n)) |
快(O(1)) |
| 中间增删效率 | 慢(O(n)) |
较快(O(n),定位耗时) |
慢(O(n)) |
| 首尾增删效率 | 快(O(1)) |
快(O(1)) |
快(O(1)) |
| 线程安全 | 否 | 否 | 是(方法加锁) |
| 内存占用 | 低 | 高(节点指针) | 低 |
| 适用场景 | 大量读操作、随机访问 | 频繁增删(首尾 / 中间) | 多线程安全需求(少用) |
四、使用建议
-
单线程场景:
- 以查询为主、少量增删 → 优先
ArrayList(性能最优)。 - 频繁增删(尤其是中间位置) → 选择
LinkedList。
- 以查询为主、少量增删 → 优先
-
多线程场景:
- 需线程安全 → 用
Collections.synchronizedList(new ArrayList<>())或CopyOnWriteArrayList(并发包,读多写少时高效),避免使用Vector(性能差)。
- 需线程安全 → 用
-
遍历注意:
ArrayList适合普通 for 循环(索引访问快);LinkedList适合增强 for 或迭代器(避免索引遍历的性能损耗);- 遍历时删除元素需用
Iterator.remove(),避免ConcurrentModificationException。