LinkedList节点在堆中独立非连续分配,靠prev/next指针维系顺序;每个Node含item、prev、next,额外开销8–16字节;无预分配与扩容,按需new Node;头尾双指针支持O(1)首尾操作及智能双向遍历。

LinkedList 的每个 Node 节点在堆内存中是**独立、非连续分配**的,彼此之间没有位置约束。
节点分散,靠指针维系逻辑顺序
每个 Node 对象由 JVM 单独分配内存空间,可能落在堆中任意可用位置——比如一个节点在 0x1000,下一个节点在 0x3A80,再下一个在 0x21F0。它们不按插入顺序“挨着”存放,也不像数组那样挤在同一块连续区域里。节点之间的先后关系,完全依赖 prev 和 next 两个引用字段(即指针)来链接。
每个节点自带额外开销
一个 Node 实例除存储实际数据(item)外,还必须保存:
- 指向前面节点的引用(prev)
- 指向后面节点的引用(next)
在主流 64 位 JVM(开启指针压缩)下,每个引用占 4 字节,共 8 字节额外空间;若未开启压缩,则各占 8 字节,共 16 字节。这意味着:存一个 int(4 字节),Node 至少要占用 12–20 字节,空间利用率低于 ArrayList。
无预分配、无扩容机制
LinkedList 不会像 ArrayList 那样预先申请一段连续内存并预留 capacity。每 add 一个元素,就 new 一个 Node,仅申请它自己所需的那块内存。因此内存使用更“按需”,但碎片化更明显,也更难被 CPU 缓存高效加载(缓存行命中率低)。
头尾双指针提升遍历效率
LinkedList 内部维护了 first 和 last 两个直接引用,分别指向首尾 Node。这使得头插、尾插、头删、尾删都只需操作常数个指针,时间复杂度稳定为 O(1)。同时,按索引访问时(如 get(i)),会自动判断 i 更靠近头还是尾,选择从 first 或 last 出发遍历,减少平均跳转次数。










