当前位置: 首页 > 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.zskr.cn/news/1350325.html

相关文章:

  • 原神抽卡数据分析神器:告别盲目抽卡,用数据掌控你的欧皇之路
  • SolidWorks服务器 + 云飞云共享云桌面,10人研发团队最省钱共享方案
  • Windows热键冲突智能诊断:Hotkey Detective技术深度解析
  • 靠谱的 x 光机厂家推荐:多科智能装备有限公司诚信为本 - 13425704091
  • Mythos能力抽象层:Anthropic的可验证AI推理架构解析
  • 近半数专业人士担忧AI低质量内容,企业领导者支招:重新思考生产力与坚持不懈
  • 用随机森林实现手写大写字母识别的完整实践
  • 如何快速配置FanControl风扇控制:从安装到优化的完整指南
  • 用随机森林实现手写英文字母识别(Python实战)
  • vue3+python基于 Python 的教育机构题包综合任务分配处理系统的设计与实现463050110
  • 如何通过本地解析技术提升网盘下载体验:LinkSwift 的完整解决方案
  • 借助taotoken在ubuntu上快速切换不同大模型进行效果对比
  • python旅游分享点评网系统
  • mid360 Failed to init livox lidar sdk 问题排查处理
  • 从DeepSeek TUI爆火,聊聊AI编程的TUI趋势与前端新机会
  • AI测试工具百花齐放,选型之前先搞懂这4个核心问题
  • Sora 2人物“变脸”真相:从CLIP-ViT时序特征坍缩到跨帧ID蒸馏损失函数重构(附可复现PyTorch代码片段)
  • ChatGPT写SEO文章到底行不行?实测127篇A/B文案后,我发现了3个99%人忽略的排名陷阱
  • 顺应IoT与健康产业融合趋势,补齐中小企业健康数字化短板
  • 3PEAK思瑞浦 TPA6531N-S6TR SOT23-6 运算放大器
  • 摆脱论文困扰!高效论文写作全流程AI论文工具推荐(2026 最新)
  • NotebookLM视频处理突然变慢?紧急排查清单:GPU卸载阈值、音频采样率陷阱、语言模型缓存泄漏
  • 2026年5月最新保定涞源黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • 图片去水印软件哪个好用?2026年好用的图片去水印软件推荐与排行榜 - 科技热点发布
  • CST案例:可调谐全硅手性超表面在太赫兹频段
  • 少走弯路:2026 最新降AI率网站测评与推荐
  • 3PEAK思瑞浦 TPA5581N-S6TR SOT23-6 运算放大器
  • 2026论文降AI率网站:11款工具实测谁配“靠谱”二字?
  • 2026年5月最新巴彦淖尔杭锦后旗黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 检测回收中心
  • 如何搭一个折叠共源共栅运放(手算版简单易懂)