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

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 有更好的性能表现。

http://www.cnnetsun.cn/news/95977.html

相关文章:

  • 【编程干货】大模型开发文档处理秘籍,让你的RAG系统性能提升10倍!
  • 【AI开发必备】Mini Agent:零门槛构建智能Agent,支持MCP工具和无限长任务,GitHub已爆![特殊字符]
  • 栈与队列学习笔记
  • Oracle回滚与撤销技术
  • 我的mybatis-flex自定义查询为什么没有参数
  • 揭秘Dify混合检索缓存机制:为何缓存清理如此重要?
  • 计划赶不上变化?错!是计划“根本赶不上开工”
  • 应用冷启动优化
  • java_base_(接口篇)省流版
  • 实测主流科技查新网站:它们如何解决专利与项目查新的双重需求?
  • 【收藏必备】零基础入门AI Agent:概念、结构、方法与开发框架全解析
  • vue基于Springboot框架实现新能源汽车4s店销售管理系统
  • 开关频率可调的永磁同步电机svpwm发电仿真模型,可调稳定发电电压,负载,母线电容可调,可用于...
  • C语言高阶玩法:函数指针与回调函数实战指南,让你的代码拥有“灵魂”
  • 基于SpringBoot的校园二手书交易平台的设计与实现
  • 数据结构与算法--007三数之和(medium)
  • C++ 模板初阶:泛型编程的入门指南
  • 基于Java实现优雅关闭的规范化方案设计与实现
  • 时序数据战场巅峰对决:金仓数据库 VS InfluxDB深度解析
  • Windows任务管理器中CPU相关指标怎么看?
  • 【必藏】大模型入行晚了?现在就是黄金时机!小白到入门的完整路线
  • 系统思考与认知习惯
  • 速藏!2026年免费免版权音乐素材网站推荐!正规版权保障,商用无压力不侵权
  • 【数据分享】1951-2024年我国省市县三级逐日、逐月和逐年近地面气温数据(Shp/Excel格式)
  • 金融行业广告投放:在合规的赛道上,实现精准增长
  • 长安汽车11月销量28.3万辆,同比增长2.3%
  • 1688 商品详情接口深度解析:从百川签名突破到供应链数据重构
  • LobeChat心理情绪日记分析工具
  • 一文搞懂纸老虎-布隆过滤器
  • LobeChat周年庆感恩回馈活动