Skip to content

Java 中 ArrayList 与 LinkedList 详解

约 605 字大约 2 分钟

ai随机问

2025-08-05

对比维度ArrayListLinkedList
底层数据结构动态数组(Object[]双向链表(每个节点含 itemprevnext
初始容量默认 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 接口实现 ListDeque 接口,支持队列 / 双端队列操作(如 addFirst()removeLast()
适用场景1. 频繁随机访问(get(index)) 2. 尾部添加 / 删除为主 3. 内存敏感场景1. 频繁在中间位置插入 / 删除 2. 实现队列 / 双端队列功能 3. 元素数量动态变化剧烈