linkedlist的node节点在内存中不连续分布,每个节点独立分配于堆内存任意位置,仅通过prev和next引用相互链接,导致缓存命中率低、随机访问为o(n),仅适合已知位置的高频增删。

LinkedList 的 Node 节点在内存中**不连续分布**,每个节点独立分配在堆内存的任意位置,仅通过指针(引用)相互关联。
节点结构决定分散性
每个 Node 包含三个字段:prev(前驱引用)、item(数据)、next(后继引用)。JVM 在插入新节点时,会为它单独调用 new Node(),触发一次独立的堆内存分配。这意味着:
- 相邻逻辑节点(如第2个和第3个元素)在物理内存地址上通常相距很远;
- 没有数组那样的“一块连续空间”前提,也不存在缓存行预加载优势;
- 内存布局完全取决于 JVM 内存分配器当时的空闲块状态,不可预测。
引用链接替代地址连续
Node 之间不靠位置偏移寻址,而是靠对象引用(本质是内存地址)显式连接:
- prev 指向另一个 Node 对象的起始地址;
- next 同样指向另一个 Node 对象的起始地址;
- 即使两个 Node 刚好被分配在相邻内存块,也只是巧合,链表逻辑不依赖该关系。
与 ArrayList 的关键对比
ArrayList 底层是 Object[] 数组,所有元素引用存储在一段连续内存中,CPU 缓存友好;而 LinkedList 的每个 Node 是独立对象,包含额外的引用字段开销(约16–24字节/节点,含对象头、对齐填充),且遍历需多次跳转指针,缓存命中率低。
实际影响:性能敏感场景需注意
频繁随机访问(如 get(i))需从头或尾开始逐个遍历 Node,时间复杂度 O(n);插入/删除虽为 O(1),但前提是已定位到目标节点——定位本身成本高。因此,LinkedList 真正适用的场景是:在已知位置(如首尾、或已有迭代器指向处)高频增删,而非按索引查取。











