两者都实现 List 接口,但底层数据结构不同,决定了性能特征的差异。

ArrayList 基于动态数组:元素连续存储,支持按下标随机访问,get/set 是 O(1);尾部追加均摊 O(1)(扩容时拷贝数组,容量增长为 1.5 倍);中间插入/删除需要移动后续元素,为 O(n)。数组连续内存对 CPU 缓存友好,遍历快,是绝大多数场景的默认选择。

LinkedList 基于双向链表:按下标访问需从头(或尾)遍历,get 是 O(n);但在已知节点位置(如迭代器处)插入/删除是 O(1)。额外开销是每个元素都要包装成节点对象,内存占用更高,且指针跳跃访问缓存不友好。

常见误区:"频繁增删就用 LinkedList"并不成立——定位到插入点本身就要 O(n) 遍历,实测 ArrayList 在多数增删场景仍更快。LinkedList 真正的适用面是作为 Deque(队列/栈)使用,它实现了 Deque 接口,两端操作都是 O(1)。

List<Integer> a = new ArrayList<>(); // 随机访问、遍历多
Deque<Integer> q = new LinkedList<>(); // 当队列/栈用(或用 ArrayDeque 更优)

追问方向:ArrayList 扩容机制?为什么 ArrayDeque 通常优于 LinkedList?

(约 340 字)