ArrayDeque 实现栈比 LinkedList 更快,因其内存局部性好、无节点对象开销、扩容高效;底层循环数组连续存储提升缓存命中率,push/pop 仅更新索引;无需创建 Node 对象,减少 GC 压力;倍增扩容优化复制性能;API 语义更贴合栈且禁止 null 避免隐患。

ArrayDeque 实现栈通常比 LinkedList 更快,主要因为内存局部性好、无节点对象开销、扩容策略更高效。
内存访问效率更高
ArrayDeque 底层是循环数组,元素在内存中连续存储,CPU 缓存命中率高。压栈(push)和弹栈(pop)操作只需更新头指针(即数组索引),时间复杂度为 O(1),且实际执行非常快。
LinkedList 每个元素是一个独立 Node 对象,分散在堆内存中,频繁的 push/pop 会引发大量非连续内存访问,缓存不友好,即使逻辑上是 O(1),实际耗时明显更高。
对象创建与垃圾回收压力小
ArrayDeque 在添加元素时只复制引用或基本类型值,不创建额外对象;扩容时也仅新建数组并批量复制,对象数量极少。
LinkedList 每次 push 都要 new 一个 Node(含 item + next + prev 三个字段),短期大量栈操作会产生大量临时对象,加重 GC 负担,尤其在高频短生命周期场景下影响显著。
扩容机制更轻量
ArrayDeque 扩容采用倍增策略(如从 16 → 32 → 64),但仅在容量不足时触发,且复制的是连续数据块,JVM 对数组复制做了高度优化(如 System.arraycopy 的底层汇编实现)。
LinkedList 无需扩容,但“无扩容”不等于“无代价”——它用空间换时间,每个元素多占两个引用字段(约 16 字节/节点,64 位 JVM),内存占用更大,间接影响缓存和吞吐。
API 语义更贴合栈用途
ArrayDeque 提供 push()、pop()、peek() 等明确的栈操作方法,语义清晰;而 LinkedList 虽然也能调用 addFirst/removeFirst 模拟栈,但其设计初衷是双端队列,容易误用(如调用 get(i) 做随机访问,导致 O(n) 性能陷阱)。
另外,ArrayDeque 不允许 null 元素,可早期暴露空指针问题;LinkedList 允许 null,可能掩盖逻辑缺陷。









