arraydeque 作为栈性能优于 stack 和 linkedlist,因其无锁设计、连续内存布局提升缓存命中率、对象分配少降低 gc 压力、1.5 倍扩容更节省空间。

ArrayDeque 作为栈使用时,性能明显优于 Stack 和 LinkedList,核心不在理论时间复杂度(三者都是均摊 O(1)),而在于底层机制与现代硬件的契合程度。
同步开销被彻底移除
Stack 继承自 Vector,所有方法(push/pop/peek)都带 synchronized 锁。即使单线程场景,JVM 仍需执行锁获取与释放流程,带来可观的常数开销。实测中,Stack 在算法题中耗时可能是 ArrayDeque 的 3 倍以上。ArrayDeque 完全无锁,指令路径更短,CPU 流水线更顺畅。
内存布局连续,缓存命中率高
ArrayDeque 底层是 Object[] 循环数组,元素物理紧邻存储。压栈、出栈、遍历等操作能充分利用 CPU cache line,预取效率高。LinkedList 每个节点分散在堆内存中,一次 pop 可能触发多次缓存未命中;Stack 虽也用数组,但扩容策略粗暴(2 倍翻倍)、不支持循环复用,频繁扩容加剧内存碎片和缓存失效。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
对象分配与 GC 压力极小
ArrayDeque 插入只更新 tail 指针,不创建新对象;LinkedList 每次 push 都要 new 一个 Node 对象(含两个引用 + 对象头 + 填充),一个 Integer 元素在 64 位 JVM 中实际占用常达 32 字节以上。高频栈操作下,LinkedList 会快速触发 Young GC,拖慢整体吞吐。
扩容策略更友好
ArrayDeque 扩容采用「1.5 倍增长」(newCapacity = oldCapacity + (oldCapacity >> 1)),比 Stack 的 2 倍更节省空间,也减少复制频次;且扩容仅发生在 tail 或 head 触达边界时,非每次操作都检查。默认初始容量 16,若预估最大深度为 N,可直接 new ArrayDeque(N),避免运行时扩容带来的延迟抖动。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










