底层数据结构 | 动态数组(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. 元素数量动态变化剧烈 |