一、底层实现
特性 |
ArrayList |
LinkedList |
数据结构 |
动态数组(Object[] 数组) |
双向链表(每个节点有前驱和后继) |
内存布局 |
连续内存,空间利用率高 |
非连续内存,空间占用大 |
元素访问方式 |
下标随机访问(基于索引) |
只能顺序遍历,找元素慢 |
⏱ 二、时间复杂度对比(核心!)
操作 |
ArrayList |
LinkedList |
随机访问 |
O(1) |
O(n) |
头部插入 |
O(n)(全体后移) |
O(1) |
中间插入 |
O(n) |
O(n) |
尾部插入 |
平均 O(1)(扩容O(n)) |
O(1) |
删除 |
O(n)(后移) |
O(n)(找到后 O(1)) |
三、扩容机制(只有 ArrayList 有)
- 初始容量默认 10
- 扩容规则:
新容量 = 老容量 * 1.5
- 扩容涉及 新数组 + 数据拷贝(O(n)),性能有抖动风险
四、适用场景总结
场景 |
推荐 |
随机访问多,读多写少 |
✅ ArrayList(查询快) |
大量插入删除,尤其是头尾操作 |
✅ LinkedList(链表优势) |
空间敏感(节省内存) |
✅ ArrayList |
需要顺序遍历 |
都可以,但 ArrayList 更快 |
五、面试总结口诀
"查快用 ArrayList,增删快用 LinkedList"
"空间紧张选 ArrayList,频繁改动选 LinkedList"