ArrayList 和 LinkedList 是 Java 集合框架中两种最常用的 List 实现,它们在底层数据结构、性能特性和适用场景上有显著差异。以下是两者的全面对比:
一、底层数据结构
| ArrayList | LinkedList | |
|---|---|---|
| 存储结构 | 动态数组 | 双向链表 |
| 内存布局 | 连续内存空间 | 非连续内存(节点通过指针连接) |
| 节点结构 | 无额外开销 | 每个元素需要额外存储前驱和后继节点引用 |
二、关键性能对比
1. 时间复杂度分析
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 随机访问(get/set) | O(1) | O(n) |
| 头部插入/删除 | O(n)(需要移动元素) | O(1) |
| 尾部插入/删除 | O(1)(均摊时间) | O(1) |
| 中间插入/删除 | O(n)(需要移动元素) | O(n)(需先遍历到指定位置) |
| 内存占用 | 更小(仅存储数据) | 更大(每个元素多2个引用) |
2. 内存使用效率
-
ArrayList:
- 内存连续,CPU缓存命中率高
- 存在容量(capacity)和大小(size)的概念,可能浪费空间
- 扩容时创建新数组并拷贝数据(默认扩容50%)
-
LinkedList:
- 每个元素需要额外存储两个引用(前驱和后继)
- 内存分散,可能增加GC压力
- 没有容量限制,按需分配节点
三、实现细节差异
ArrayList 关键实现
// 底层数组
transient Object[] elementData;
// 自动扩容机制
private void grow(int minCapacity) {
int oldCapacity = elementData


1304

被折叠的 条评论
为什么被折叠?



