arraylist有扩容机制,linkedlist没有扩容概念;前者基于连续数组,扩容需1.5倍增长并全量复制;后者基于双向链表,每次添加仅新建node节点,无容量限制与数据复制。

ArrayList 有扩容机制,LinkedList 没有扩容概念——这是根本区别。
ArrayList 的扩容是数组伸缩的刚性过程
ArrayList 底层是 Object[] 数组,内存连续。初始无参构造时用空数组,首次 add 才分配 10 个元素空间。后续容量不足时触发 grow():
- 新容量 = 原容量 + 原容量右移 1 位(即 ×1.5),比如 10→15、15→22、22→33
- 若 1.5 倍仍不够,则直接取所需最小容量(minCapacity)
- 必须调用 Arrays.copyOf() 全量复制旧数组,涉及一次 O(n) 内存拷贝
- 每次扩容都产生新数组,旧数组等待 GC,存在短时双倍内存占用
LinkedList 根本不扩容,只按需新建节点
LinkedList 是双向链表,没有“容量”或“满”的概念。每个 add 都新建一个 Node 对象:
- Node 包含 item + prev + next 三个字段,对象独立分配在堆中,内存不连续
- 插入头尾(add(E)、addFirst、addLast)只需调整指针,时间复杂度 O(1),无复制开销
- 没有预分配、不预留空间,也不会因“满了”而触发批量操作
- 内存占用恒定多出约 16 字节/元素(两个引用字段),但无冗余空间浪费
内存布局差异直接影响性能表现
ArrayList 连续内存对 CPU 缓存友好,get(index) 是单次地址计算,毫秒级响应;LinkedList 节点分散,遍历 get(i) 需逐个跳转指针,缓存命中率低,实测百万数据下随机访问慢数十倍。
反过来看,频繁在中间增删时,ArrayList 要移动大量元素并可能触发扩容拷贝,而 LinkedList 只改几个指针——但前提是你要先找到那个位置,否则遍历成本已抵消优势。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











