当前位置: 首页 > news >正文

Java 中 ArrayDeque 与 LinkedList 作为栈使用的性能对比

在 Java 中实现栈结构时,优先推荐使用 ArrayDeque,而不是 LinkedList 或传统的 Stack 类。

先说结论:ArrayDeque 是官方推荐的栈实现方案,通常在内存占用和访问速度上优于 LinkedList。

  • 适合:单线程环境下的栈操作场景,如表达式求值、深度优先搜索。
  • 重点看:底层数据结构差异,数组连续内存带来的缓存友好性。
  • 别忽略:ArrayDeque 不允许存放 null 元素,且不是线程安全的。

代码迁移示例

如果你正在使用 LinkedList 模拟栈,可以参考以下替换方式。ArrayDeque 同样实现了 Deque 接口,支持 push/pop/peek 方法。

// 原代码 (LinkedList 作为栈)
LinkedList<String> stack = new LinkedList<>();
stack.push("A");
String top = stack.pop();// 建议替换为 (ArrayDeque)
ArrayDeque<String> stack = new ArrayDeque<>();
stack.push("A");
String top = stack.pop();

性能差异与基准测试

ArrayDeque 性能优于 LinkedList 的主要原因有两点:一是 LinkedList 每个节点都需要额外的对象头开销和前后指针引用,内存占用更高;二是 ArrayDeque 基于数组,内存连续,对 CPU 缓存更友好,遍历和访问效率更高。

以下是使用 JMH 进行基准测试的代码示例,可用于验证具体环境下的性能差异:

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
public class StackBenchmark {private Deque<String> arrayDeque;private Deque<String> linkedList;@Setuppublic void setup() {arrayDeque = new ArrayDeque<>();linkedList = new LinkedList<>();}@Benchmarkpublic void testArrayDeque() {arrayDeque.push("data");arrayDeque.pop();}@Benchmarkpublic void testLinkedList() {linkedList.push("data");linkedList.pop();}
}

在高频入栈出栈场景下,ArrayDeque 通常表现出更低的延迟和更高的吞吐量。

多线程安全实践

ArrayDeque 不是线程安全的。如果涉及多线程共享栈,需要外部同步。

方案一:使用 Collections 包装

Deque<String> stack = Collections.synchronizedDeque(new ArrayDeque<>());

方案二:显式锁控制(推荐用于复合操作)

private final Deque<String> stack = new ArrayDeque<>();
private final Lock lock = new ReentrantLock();public void safePush(String item) {lock.lock();try {stack.push(item);} finally {lock.unlock();}
}

验证与常见坑

  • null 元素限制:LinkedList 允许 null,ArrayDeque 不允许,插入 null 会抛出 NullPointerException。
  • 线程安全误解:多线程 push/pop 需要外部锁保护,不可直接共享实例。
  • 容量扩展:ArrayDeque 扩容时会复制数组,初始化时指定合适容量可减少扩容抖动。
  • 单元测试:替换后运行现有单元测试,确保功能行为未改变。

参考来源

1. Oracle Java Documentation - Class ArrayDeque
URL: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ArrayDeque.html

原文链接:https://www.zjcp.cc/ask/11774.html

http://www.jsqmd.com/news/867074/

相关文章:

  • 如何快速掌握Topit:macOS窗口置顶工具的终极指南
  • 2026年软考算法知识点—计算机等级考试—软件设计师考前备忘录—东方仙盟
  • Windows热键冲突智能诊断:Hotkey Detective技术深度解析
  • 2026年杭州临平奢侈品回收标杆:杭州名家奢侈品,临平本地回收价高、口碑可靠的TOP1之选商家 - 人间半盏茶
  • 靠谱的 x 光机厂家推荐:多科智能装备有限公司诚信为本 - 13425704091
  • 为什么92%的浙江话语音项目在ElevenLabs上失败?——资深方言NLP工程师20年踩坑复盘
  • 5分钟免费备份QQ空间所有历史记录:GetQzonehistory终极指南
  • 广州搬家公司哪家靠谱:大黄蜂搬家诚信可靠 - 13425704091
  • 为什么93%的团队在Lindy-Slack集成中忽略API Rate Limiting?——生产环境熔断策略与退避算法详解
  • 思源宋体:让中文排版变得优雅又简单
  • 专业的 x 光机厂家推荐:多科智能装备有限公司技术精湛 - 19120507004
  • 近半数专业人士担忧AI低质量内容,企业领导者支招:重新思考生产力与坚持不懈
  • 2025 AI工程落地核心论文实战指南:从推理优化到多模态系统
  • 5/22
  • 摆脱论文困扰!高效论文写作全流程AI论文工具推荐(2026 最新)
  • 普宁二胎宝妈月子中心选哪家|二胎选月子中心和一胎有哪些不同 - 品牌观察
  • 广州搬家公司哪家性价比高:大黄蜂搬家物美价优 - 19120507004
  • vue3+python基于 Python 的教育机构题包综合任务分配处理系统的设计与实现463050110
  • 程序员想开 AI 会员:ChatGPT、Claude、Gemini 这些该怎么充值更省心?
  • 2026年5月最新鞍山千山黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • 广州搬家公司哪家专业:大黄蜂搬家技艺精湛 - 13724980961
  • 如何通过本地解析技术提升网盘下载体验:LinkSwift 的完整解决方案
  • 【设计模式 13】命令:覆水能收
  • Java的继承与接口基础概念辨析
  • 2026年5月最新鞍山台安黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • 超高分子量聚乙烯板(UHMWPE)选型完全指南:从分子量、密度到 12 大行业适用场景全解析
  • 2026 年流量大变天:你的客户正在从百度转向 AI,再不做 GEO 就晚了 - 商业科技观察
  • 软件神器 --- 视频格式转化 之 handbrake
  • 2026年5月最新鞍山铁东黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • 【设计模式 14】责任链:谁来拍板