核心原理
List 家族:有序、可重复
List 表示有顺序、允许重复元素的集合。常见实现:
ArrayList:动态数组,随机访问快,最常用LinkedList:双向链表,头尾插入删除更方便Vector:老的线程安全列表,很少作为首选Stack:继承Vector的栈,现代代码更常用Deque
List<String> names = new ArrayList<>();names.add("Tom");names.add("Jerry");System.out.println(names.get(0));ArrayList 和 LinkedList 怎么选
| ArrayList | LinkedList | |
|---|---|---|
| 底层 | 动态数组 | 双向链表 |
| 随机访问 | get(index) 快 | 需沿链表移动,慢 |
| 头尾增删 | 尾部追加通常高效 | 头尾更直接 |
经验:默认 ArrayList;只有频繁头尾插入删除且很少按下标访问时,再考虑 LinkedList。

ArrayList 进阶:扩容、序列化与 Vector
ArrayList 底层是 Object[] elementData。容量不够时扩容:JDK 8 默认先扩到 1.5 倍(oldCapacity + (oldCapacity >> 1)),再拷贝元素。
Vector 同样基于数组,但方法带 synchronized,线程安全、性能较低;扩容通常是 2 倍(或 2 * oldCapacity + 1)。单线程用 ArrayList;需要同步列表用 Collections.synchronizedList(list) 或 CopyOnWriteArrayList。
ArrayList 实现了 Serializable,但 elementData 为 transient——writeObject 只写出 size 个有效元素,减小序列化体积。
List<String> safe = Collections.synchronizedList(new ArrayList<>());面试速记
- List / Set / Map:
List有序可重复;Set不重复;Map键值对。 - ArrayList vs LinkedList:数组 vs 链表;大多数场景
ArrayList。 - ArrayList vs Vector:约 1.5 倍扩容 vs 2 倍 + 同步;单线程
ArrayList。
→ 更多见 集合面试 52 道