news 2026/6/1 9:18:21

java基础-Deque 接口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java基础-Deque 接口

1. 什么是 Deque?

Deque(Double Ended Queue,双端队列)是 Java Collections Framework 的一部分,它支持在队列的两端进行插入和删除操作。

2. Deque 的特点

  • 双端操作:可以从头部和尾部添加/删除元素

  • 可用作多种数据结构

    • 普通队列(FIFO)

    • 栈(LIFO)

    • 双端队列

3. 主要实现类

// ArrayDeque - 基于数组实现,性能较好,推荐使用 Deque<String> arrayDeque = new ArrayDeque<>(); // LinkedList - 基于链表实现,也实现了Deque接口 Deque<String> linkedListDeque = new LinkedList<>(); // ConcurrentLinkedDeque - 线程安全版本(java.util.concurrent) Deque<String> concurrentDeque = new ConcurrentLinkedDeque<>();

4. 常用操作方法

4.1 添加元素

Deque<Integer> deque = new ArrayDeque<>(); // 头部操作 deque.addFirst(1); // 抛出异常 deque.offerFirst(2); // 返回boolean // 尾部操作 deque.addLast(3); // 抛出异常 deque.offerLast(4); // 返回boolean // 等价方法 deque.add(5); // addLast() deque.offer(6); // offerLast() deque.push(7); // addFirst() - 栈操作

4.2 删除元素

// 头部删除 int first1 = deque.removeFirst(); // 抛出异常 int first2 = deque.pollFirst(); // 返回null // 尾部删除 int last1 = deque.removeLast(); // 抛出异常 int last2 = deque.pollLast(); // 返回null // 等价方法 int elem1 = deque.remove(); // removeFirst() int elem2 = deque.poll(); // pollFirst() int elem3 = deque.pop(); // removeFirst() - 栈操作

4.3 查看元素(不删除)

// 查看头部 int head1 = deque.getFirst(); // 抛出异常 int head2 = deque.peekFirst(); // 返回null int head3 = deque.element(); // getFirst() int head4 = deque.peek(); // peekFirst() // 查看尾部 int tail1 = deque.getLast(); // 抛出异常 int tail2 = deque.peekLast(); // 返回null

5. 使用示例

示例1:作为栈使用

Deque<Integer> stack = new ArrayDeque<>(); // 入栈 stack.push(1); stack.push(2); stack.push(3); // 出栈 while (!stack.isEmpty()) { System.out.println(stack.pop()); // 输出: 3, 2, 1 }

示例2:作为队列使用

Deque<String> queue = new ArrayDeque<>(); // 入队 queue.offer("A"); queue.offer("B"); queue.offer("C"); // 出队 while (!queue.isEmpty()) { System.out.println(queue.poll()); // 输出: A, B, C }

示例3:双端操作

Deque<Character> deque = new ArrayDeque<>(); // 两端添加 deque.addFirst('B'); deque.addLast('C'); deque.addFirst('A'); deque.addLast('D'); // 遍历 for (char c : deque) { System.out.print(c + " "); // 输出: A B C D } // 两端删除 System.out.println(deque.removeFirst()); // A System.out.println(deque.removeLast()); // D

6. ArrayDeque vs LinkedList

特性ArrayDequeLinkedList
数据结构可扩展数组双向链表
内存使用更紧凑每个元素额外存储前后指针
性能随机访问快插入删除快(指定位置)
推荐使用大多数场景需要频繁在中间操作时

7. 实际应用场景

// 场景1:滑动窗口最大值 public int[] maxSlidingWindow(int[] nums, int k) { Deque<Integer> deque = new ArrayDeque<>(); int[] result = new int[nums.length - k + 1]; for (int i = 0; i < nums.length; i++) { // 移除超出窗口的元素 if (!deque.isEmpty() && deque.peekFirst() == i - k) { deque.pollFirst(); } // 保持deque递减 while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) { deque.pollLast(); } deque.offerLast(i); // 记录窗口最大值 if (i >= k - 1) { result[i - k + 1] = nums[deque.peekFirst()]; } } return result; } // 场景2:括号匹配检查 public boolean isValid(String s) { Deque<Character> stack = new ArrayDeque<>(); for (char c : s.toCharArray()) { if (c == '(' || c == '[' || c == '{') { stack.push(c); } else { if (stack.isEmpty()) return false; char top = stack.pop(); if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) { return false; } } } return stack.isEmpty(); }

8. 注意事项

  1. 容量限制:ArrayDeque 有初始容量,可自动扩容

  2. 空值处理

    • addFirst/addLast:不接受 null(会抛出 NPE)

    • offerFirst/offerLast:不接受 null

  3. 线程安全:ArrayDeque 和 LinkedList 都不是线程安全的

  4. 性能考虑:ArrayDeque 通常比 LinkedList 性能更好

总结

Deque是一个非常实用的接口,它提供了队列和栈的完整功能。在大多数情况下,推荐使用ArrayDeque作为实现类,因为它比 LinkedList 有更好的性能表现。

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

震惊!AI Agent架构的“五脏六腑“全曝光!从底层到SaaS平台,5层架构带你秒懂大模型Agent开发(附全景图)

下面是一个科普式总结&#xff0c;适合不了解这块的同学&#xff01; 下面按照“底层执行引擎 → 任务编排 → 多 Agent 协作 → 应用级框架 → SaaS Agent 平台”五层给你分层总结&#xff0c;覆盖大公司、初创公司、开源社区。 业界主流 Agent Infra 全景图 Layer 5: SaaS Ag…

作者头像 李华
网站建设 2026/6/1 3:56:01

【python大数据毕设实战】天猫订单交易数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

作者头像 李华
网站建设 2026/5/31 20:08:53

【每天学习一点算法2025/12/16】二叉树的最大深度

每天学习一点算法 2025/12/16 题目&#xff1a;二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 要取得二叉树的最大深度&#xff0c;就需要遍历树&#xff0c;二叉树的遍历方法我的…

作者头像 李华
网站建设 2026/5/31 16:39:52

comsol锂枝晶模型 五合一 单枝晶定向生长、多枝晶定向生长、多枝晶随机生长、无序生长随机形...

comsol锂枝晶模型 五合一 单枝晶定向生长、多枝晶定向生长、多枝晶随机生长、无序生长随机形核以及雪花枝晶&#xff0c;包含相场、浓度场和电场三种物理场&#xff08;雪花枝晶除外&#xff09;&#xff0c;其中单枝晶定向生长另外包含对应的参考文献。锂枝晶生长模型在电池失…

作者头像 李华
网站建设 2026/6/1 0:54:29

springboot在线影视论坛-计算机毕业设计源码71111

摘 要 随着互联网影视内容的快速发展&#xff0c;用户对影视作品的需求日益增多&#xff0c;尤其是通过在线平台来获取影视信息、评论与观看的需求日渐突出。因此&#xff0c;构建一个集影视信息管理、用户互动、社区功能于一体的在线影视论坛平台显得尤为重要。系统致力于为用…

作者头像 李华