List 与 ArrayList

笔记/Java/Java基础/Java集合/List 与 ArrayList

上一篇:集合框架总览 · 下一篇:Set

核心原理#

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 怎么选#

ArrayListLinkedList
底层动态数组双向链表
随机访问get(index)需沿链表移动,慢
头尾增删尾部追加通常高效头尾更直接

经验:默认 ArrayList;只有频繁头尾插入删除且很少按下标访问时,再考虑 LinkedList

ArrayList 与 LinkedList 结构
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,但 elementDatatransient——writeObject 只写出 size 个有效元素,减小序列化体积。

List<String> safe = Collections.synchronizedList(new ArrayList<>());

面试速记#

  • List / Set / MapList 有序可重复;Set 不重复;Map 键值对。
  • ArrayList vs LinkedList:数组 vs 链表;大多数场景 ArrayList
  • ArrayList vs Vector:约 1.5 倍扩容 vs 2 倍 + 同步;单线程 ArrayList

→ 更多见 集合面试 52 道

文章目录

文章目录