Deque接口的核心作用是提供两端高效增删的线性结构,兼顾FIFO队列与LIFO栈语义;支持add/remove/get(抛异常)和offer/poll/peek(返回null或false)两套方法;常用实现有ArrayDeque(高效单线程)、LinkedList(支持null)和LinkedBlockingDeque(线程安全阻塞)。

Deque接口的核心作用是提供一种可以在两端高效插入和删除元素的线性数据结构,既支持队列(FIFO)又支持栈(LIFO)语义,比单独使用Queue或Stack更灵活、性能更好。
支持两端操作,兼顾队列与栈行为
Deque允许在头部(first)和尾部(last)分别执行添加、移除、查看操作,因此一套接口就能实现两种经典结构:
- 当作队列用:用
offerLast()入队、pollFirst()出队(FIFO) - 当作栈用:用
push()压栈、pop()弹栈(LIFO),等价于offerFirst()/pollFirst() - 无需切换类——同一个Deque实例可随时切换使用模式
提供两套方法,兼顾异常处理与容错能力
每个操作都有“抛异常”和“返回特殊值”两种版本,便于适配不同场景:
- 失败时抛异常:如
addFirst()、removeLast()、getFirst()(空时抛NoSuchElementException) - 失败时返回安全值:如
offerFirst()返回boolean、pollLast()返回null、peekFirst()为空时也返回null - 推荐日常使用带
offer/poll/peek前缀的方法,避免程序意外崩溃
常用实现类各有所长,按需选用
Deque是接口,必须通过具体实现类来使用,主流选择有:
立即学习“Java免费学习笔记(深入)”;
-
ArrayDeque:基于循环数组,无null元素限制,插入/删除效率高,栈操作比传统
Stack快得多,适合单线程高频场景 -
LinkedList:基于双向链表,支持
null,随机访问慢但首尾操作稳定,也常用于需要栈语义的逻辑 -
LinkedBlockingDeque:线程安全、可选容量限制,含阻塞方法(如
putFirst()),适用于多线程生产者-消费者或工作密取(work-stealing)模型
典型实用场景举例
不只是理论结构,Deque在真实开发中解决实际问题:
-
浏览器历史记录:前进/后退用
push()和pop()维护栈式导航 - 撤销(Undo)功能:每步操作存入Deque尾部,撤销即
removeLast() - 滑动窗口算法:用
offerLast()进、pollFirst()出,配合peekFirst()查最老元素 - 任务调度:线程本地双端队列 + 工作密取,提升并发吞吐量










