ArrayDeque 在双端队列场景下优于 LinkedList,因其头尾操作更快(O(1)均摊、快近5倍)、内存占用更低(8字节/元素 vs 24字节)、缓存命中率更高(连续内存),且禁止 null 更安全。

ArrayDeque 在绝大多数双端队列场景下比 LinkedList 更优,核心优势集中在性能、内存和缓存三方面。
更快的头尾操作速度
ArrayDeque 基于循环数组实现,头尾插入/删除都是 O(1) 均摊时间,且常数因子极小。实测 10 万次栈操作,ArrayDeque 耗时约 3ms,LinkedList 约 15ms —— 快近 5 倍。
- 无需遍历或指针跳转,直接通过索引和头尾指针完成操作
- 扩容虽有开销,但仅在容量不足时触发,实际使用中很少成为瓶颈
- JDK 官方文档明确推荐 ArrayDeque 替代 Stack 和普通队列
更低的内存占用
ArrayDeque 每个元素只存数据本身,约 8 字节;LinkedList 每个节点需额外存储前驱、后继引用及对象头,实测达 24 字节/元素。
- 内存连续,无链表节点碎片,GC 压力更小
- 不预先分配大量空间,初始容量为 16,按需翻倍扩容
- 适合高吞吐、低延迟或内存敏感型服务(如实时风控、高频缓存)
更高的缓存命中率
数组内存连续,CPU 缓存预取友好;LinkedList 节点分散在堆中,每次访问都可能引发缓存未命中。
立即学习“Java免费学习笔记(深入)”;
- BFS、滑动窗口等遍历+头尾操作混合场景,ArrayDeque 实际表现更稳
- 尤其在现代 CPU 架构下,缓存效率对整体性能影响远超理论复杂度
- 没有指针跳转,分支预测更简单,指令流水线更顺畅
更安全的设计约束
ArrayDeque 不允许 null 元素,这看似是限制,实则是主动规避空指针歧义。
- 避免了 peek()/poll() 返回 null 时无法区分“队列空”和“存了 null”
- 强制开发者显式处理空值逻辑,减少隐蔽 bug
- 与现代 Java 强类型、非空优先的设计趋势一致
基本上就这些。除非你需要在列表中间频繁增删,或者必须存 null,否则 ArrayDeque 是双端队列和栈的默认首选。










