news 2026/4/15 12:22:18

java基础-ArrayDeque

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java基础-ArrayDeque

ArrayDequeJava 集合框架中的一个类,它是一个基于可调整大小的循环数组实现的双端队列

是Deque接口的实现类之一

继承关系:

Iterable (接口) ↓ Collection (接口) ↓ Queue (接口) ↓ Deque (接口) ↓ ┌─────────────────┐ │ ArrayDeque (类) │ ← 具体实现 └─────────────────┘

主要特点:

1.数据结构

  • 底层使用动态数组(循环数组)实现

  • 允许从两端高效地添加/移除元素

  • 内存连续,访问速度快

2.核心特性

  • 线程不安全(非同步)

  • 不允许存储 null 元素

  • 初始容量默认为16,自动扩容(2倍)

  • 既可作为栈(Stack)使用,也可作为队列(Queue)使用

  • 性能通常优于 LinkedList(作为队列/栈时)

常用方法:

队列操作(FIFO)

ArrayDeque<String> deque = new ArrayDeque<>(); // 添加元素到队尾 deque.offer("A"); // 推荐 deque.add("B"); // 可能抛出异常 deque.offerLast("C"); // 明确指定队尾 // 从队首移除并返回 String first = deque.poll(); // 返回null如果为空 String first2 = deque.remove(); // 抛出异常如果为空 String first3 = deque.pollFirst(); // 查看队首(不移除) String peek = deque.peek(); String peek2 = deque.peekFirst();

栈操作(LIFO)

// 作为栈使用 ArrayDeque<String> stack = new ArrayDeque<>(); // 压栈 stack.push("A"); // 添加到队首 stack.addFirst("B"); // 弹栈 String top = stack.pop(); // 移除队首 String top2 = stack.pollFirst(); // 查看栈顶 String peek = stack.peek(); String peek2 = stack.peekFirst();

双端队列操作

// 队首操作 deque.addFirst("First"); deque.offerFirst("First"); deque.removeFirst(); deque.pollFirst(); // 队尾操作 deque.addLast("Last"); deque.offerLast("Last"); deque.removeLast(); deque.pollLast();

性能对比

操作ArrayDequeLinkedList
添加/删除(两端)O(1)*O(1)
随机访问O(1)O(n)
内存使用更紧凑更多(节点开销)
遍历速度更快(缓存友好)较慢

注意:ArrayDeque的O(1)是分摊时间复杂度,扩容时会有额外开销

使用场景推荐:

推荐使用 ArrayDeque:

  1. 作为栈使用(替代过时的 Stack 类)

    // 推荐 Deque<Integer> stack = new ArrayDeque<>(); // 不推荐(已过时) Stack<Integer> oldStack = new Stack<>();
  2. 作为队列使用

    Queue<String> queue = new ArrayDeque<>();
  3. 需要高效的双端操作

    Deque<Integer> deque = new ArrayDeque<>();

不适合的场景:

  1. 需要线程安全(考虑使用 ConcurrentLinkedDeque)

  2. 需要存储 null 元素

  3. 需要频繁在中间插入/删除

示例代码:

public class ArrayDequeExample { public static void main(String[] args) { // 1. 作为队列 Queue<Integer> queue = new ArrayDeque<>(); queue.offer(1); queue.offer(2); System.out.println(queue.poll()); // 1 // 2. 作为栈 Deque<Integer> stack = new ArrayDeque<>(); stack.push(1); stack.push(2); System.out.println(stack.pop()); // 2 // 3. 作为双端队列 ArrayDeque<String> deque = new ArrayDeque<>(); deque.addFirst("First"); deque.addLast("Last"); System.out.println(deque); // [First, Last] } }

注意事项:

  1. 线程安全:ArrayDeque 不是线程安全的,多线程环境下需要外部同步

  2. 容量限制:最大容量是Integer.MAX_VALUE - 8

  3. 迭代器:迭代器是 fail-fast 的

  4. 性能:在大多数场景下,作为栈/队列使用时性能优于 LinkedList

总结:ArrayDeque 是 Java 中实现队列和栈的首选类,它提供了高效的性能、简洁的API,并且比传统的Stack类更现代、更安全。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 8:49:56

47年国货焕新:中顺洁柔凭北森学习系统建立制造业人才转型样板

在北森第三届用户英雄大会AI Learning分论坛上&#xff0c;中顺洁柔人力资源总监张建瓴女士的分享&#xff0c;为在场听众勾勒出一幅传统制造业在时代浪潮中稳健又充满活力的进化图景。这家拥有47年历史的国货品牌&#xff0c;没有讲述多么炫酷的技术神话&#xff0c;而是坦诚地…

作者头像 李华
网站建设 2026/4/14 18:40:02

jetty9配置contextPath

配置 Jetty 9 的 Context Path在 Jetty 9 中配置 contextPath 可以通过多种方式实现&#xff0c;以下是几种常见的方法&#xff1a;通过 web.xml 配置在 web.xml 文件中&#xff0c;可以通过 <context-param> 设置 contextPath。例如&#xff1a;<context-param>&l…

作者头像 李华
网站建设 2026/4/15 3:21:08

从零配置Python测试环境:详解路径、依赖与虚拟环境最佳实践

事情是这样的&#xff1a;前几天写了篇推广自动化测试的吐槽文章&#xff0c;结果被同事刷到了&#xff08;谁也逃不过大数据&#xff09;&#x1f602; 不过他没生气&#xff0c;反而说一定会搞明白 Python 到底是啥&#x1f60f; 那行吧&#xff0c;这篇就当作一个小小的 Pyt…

作者头像 李华
网站建设 2026/4/12 17:51:58

测试管理:为何测试场景覆盖不全问题频现?

在软件开发和质量管理的过程中&#xff0c;测试场景覆盖不足是一个常见的痛点。尽管测试团队倾力构建详尽的测试用例集&#xff0c;但在实践中却常常出现测试场景覆盖不全的情况&#xff0c;这不仅可能导致产品质量问题的漏检&#xff0c;还可能引发用户在实际使用过程中的不满…

作者头像 李华
网站建设 2026/4/10 19:43:22

极速获取ONNX模型:gh_mirrors/model/models镜像站点的6大下载策略

还在为ONNX模型下载速度慢而苦恼吗&#xff1f;&#x1f914; 每次等待大文件下载完成都像是在浪费时间&#xff1f;今天&#xff0c;我将为你揭秘6种高效的ONNX模型快速下载方法&#xff0c;让你从此告别漫长的等待&#xff01; 【免费下载链接】models A collection of pre-t…

作者头像 李华
网站建设 2026/4/8 15:45:12

JUCE框架实战指南:30天从零到专业音频插件开发

JUCE框架实战指南&#xff1a;30天从零到专业音频插件开发 【免费下载链接】JUCE 项目地址: https://gitcode.com/gh_mirrors/juc/JUCE 你是否曾经梦想过开发属于自己的音频插件&#xff0c;却因为复杂的跨平台适配和底层音频处理而却步&#xff1f;想象一下&#xff0…

作者头像 李华