| 底层数据结构 | 动态数组(Object[]) | 双向链表(每个节点含 item、prev、next) |
| 初始容量 | 默认 10(JDK 8+),可通过构造函数指定初始容量 | 无固定初始容量,节点随元素添加动态创建 |
| 扩容机制 | 元素满时扩容为原容量的 1.5 倍,需复制数组(O(n) 耗时) | 无扩容机制,添加元素仅需创建新节点并修改指针 |
| 随机访问支持 | 支持(通过数组下标直接访问) | 不支持(需从首尾遍历链表) |
get(int index) 时间复杂度 | O(1)(直接通过 array[index] 访问) | O(n)(需遍历到目标位置,根据索引远近选择从头 / 尾开始) |
尾部添加(add(E e)) | O(1)(无扩容时);扩容时 O(n)(复制数组),平均仍为 O(1) | O(1)(直接操作尾节点指针) |
指定位置添加(add(int index, E e)) | O(n)(需移动目标位置后所有元素) | O(n)(遍历到目标位置耗时 O(n),插入仅修改指针 O(1)) |
删除元素(remove(int index)) | O(n)(删除后需移动后续元素覆盖空位) | O(n)(遍历到目标位置耗时 O(n),删除仅修改指针 O(1)) |
| 遍历性能(普通 for 循环) | 极高(O(n)),缓存友好(内存连续存储,CPU 缓存命中率高) | 极低(O(n²),每次 get(index) 需重新遍历) |
| 遍历性能(迭代器 / 增强 for) | O(n) | O(n)(优于普通 for 循环,但仍不如 ArrayList 缓存友好) |
| 内存占用 | 较低(仅存储元素值,可能有扩容预留空间浪费) | 较高(每个元素需额外存储 2 个指针引用,64 位 JVM 中单个节点约 24 字节) |
| 内存存储特性 | 元素在内存中连续存储,内存碎片少 | 节点在内存中分散存储,可能产生较多内存碎片 |
| 实现的额外接口 | 仅实现 List 接口 | 实现 List 和 Deque 接口,支持队列 / 双端队列操作(如 addFirst()、removeLast()) |
| 适用场景 | 1. 频繁随机访问(get(index)) 2. 尾部添加 / 删除为主 3. 内存敏感场景 | 1. 频繁在中间位置插入 / 删除 2. 实现队列 / 双端队列功能 3. 元素数量动态变化剧烈 |