根本差异源于底层结构:ArrayList用连续数组实现O(1)随机访问但扩容有复制开销,LinkedList用分散节点链表实现O(n)遍历访问但增删灵活;前者内存紧凑但可能浪费,后者内存开销大但按需分配。

内存分配和随机访问是 ArrayList 和 LinkedList 最根本的差异来源,直接由它们的底层数据结构决定——一个用数组,一个用链表。
内存分配:连续块 vs 分散节点
ArrayList 在堆内存中申请一段连续的内存空间,像一排紧挨着的房间。初始默认容量为 10,当存满后会按 1.5 倍扩容(比如从 10 扩到 15),并把旧数据复制过去。这种分配方式简单高效,但可能造成空间浪费(比如只用了 12 个元素却占了 15 个位置)。
LinkedList 没有“容量”概念,每个元素都封装成一个 Node 对象,包含 item、prev 和 next 三个字段。这些 Node 在内存中是分散分配、靠指针链接的,就像各自租住在不同街区,靠地址纸条(引用)互相找到对方。每个元素额外多占约 16 字节(64 位 JVM 下两个引用),内存开销明显更大。
随机访问:O(1) 直达 vs O(n) 遍历
ArrayList 的 get(int index) 是真正的随机访问:直接用索引计算出元素在数组中的内存偏移量,一步读取,时间复杂度稳定为 O(1)。哪怕列表有百万元素,取第 999999 个也几乎不花额外时间。
立即学习“Java免费学习笔记(深入)”;
LinkedList 根本不支持真正随机访问。它的 get(int index) 方法必须先调用 node(index),从头(或尾,选更近的一端)开始逐个跳转指针,平均要遍历一半节点才能定位目标,时间复杂度为 O(n)。实测中,对 10 万个元素做 1 万次随机访问,ArrayList 耗时通常不到 1 毫秒,LinkedList 可能超过 5000 毫秒。
为什么这个区别影响实际使用?
- 频繁用 for (int i = 0; i
- 需要根据下标反复查、改特定位置的值?只能选 ArrayList,LinkedList 在这类场景下性能会断崖式下跌。
- 内存敏感且元素极多(如嵌入式环境)?ArrayList 的紧凑布局更有优势;而 LinkedList 的指针开销会随元素数线性增长。


















