当前位置: 首页 > 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.jsqmd.com/news/102002/

相关文章:

  • 为什么你的服务无法被发现?,深入Docker MCP网关注册原理与排错技巧
  • [特殊字符]程序员必看!LatentMAS框架让AI智能体‘脑内对话‘,效率飙升83%,代码生成速度翻4倍!
  • 【Docker Offload云端资源对接实战】:揭秘高效资源调度的5大核心技术
  • 揭秘大模型“理解力“背后的黑科技!OPM本体建模教程,让AI秒懂你的业务
  • 震惊!Deep Agents让AI智能体“开挂“了!任务分解+子智能体+虚拟文件系统,小白也能构建“超级智能体“!
  • 【编程干货】大模型开发文档处理秘籍,让你的RAG系统性能提升10倍!
  • 震惊!AI Agent架构的“五脏六腑“全曝光!从底层到SaaS平台,5层架构带你秒懂大模型Agent开发(附全景图)
  • 【程序员搞钱新方向】LangGraph+MCP开发AI智能体,企业级监控系统全栈实现,代码开源!
  • 【yyds】9种高级Chunking策略让RAG系统性能起飞,大模型开发者必看干货!
  • LangGraph入门到精通:解锁大模型数据流转的“四大金刚“!
  • Python 爬虫实战:沪深 300 股票(上)—— 小白入门!爬取当天实时数据
  • 【AI开发必备】Mini Agent:零门槛构建智能Agent,支持MCP工具和无限长任务,GitHub已爆![特殊字符]
  • 如何让Dify中的Tesseract识别速度提升5倍?资深架构师亲授调优清单
  • 加密PDF的Dify批量解析(企业级数据提取终极方案)
  • 【自然语言处理】字符编码与字频统计:中文信息处理的底层逻辑与实践维度
  • 实测主流科技查新网站:它们如何解决专利与项目查新的双重需求?
  • 【自然语言处理】单字与双字字频统计算法设计
  • 市场上MES供应商众多,各自的侧重点有何不同?我们该如何找到最适合自己行业和需求的?
  • 律师必备!揭秘高效协作的5款顶级App!
  • 【专家亲授】:Dify平台视频帧存储优化的5大黄金法则
  • 应用冷启动优化
  • 为什么make4ht -x abc.tex生成的HTML文件没有样式
  • 一多开发实例(购物比价)
  • 交换机.路由器.防火墙-技术提升【7.4】
  • Docker MCP 网关服务注册难题破解:如何确保99.99%注册成功率?
  • 代码重构艺术的技术
  • 交换机.路由器.防火墙-技术提升【7.5】
  • Oracle回滚与撤销技术
  • 还在手动管理Dify用户?教你自动化批量管控的7种高效方法
  • Microsoft DP-700 認證考試介紹|Implementing Data Engineering Solutions Using Microsoft Fabric