arraydeque是java中实现高效fifo和lifo的首选,应使用offerlast()+pollfirst()实现fifo、offerfirst()+pollfirst()实现lifo;避免混用端点、随机访问及线程不安全操作。

Java 中的 Deque(Double-ended Queue)接口支持在队列两端高效地插入和删除元素,是实现双端队列操作的标准方式。它既可作为栈(LIFO)使用,也可作为队列(FIFO)使用,底层常用实现类有 ArrayDeque(推荐)和 LinkedList。
选择合适的实现类
ArrayDeque 是基于循环数组实现的,性能优于 LinkedList(尤其在随机访问和内存局部性方面),且不支持 null 元素;LinkedList 虽然也实现了 Deque,但因链表开销较大,一般仅在需要频繁中间插入/删除时才考虑。
- 优先用
ArrayDeque:适用于绝大多数双端队列场景 - 避免用
Stack类:已过时,非线程安全且设计不佳 - 不要直接 new 接口:需实例化具体实现类,例如
Deque<string> deque = new ArrayDeque();</string>
常用双端操作方法详解
理解方法命名规律很关键:addFirst/addLast、removeFirst/removeLast、peekFirst/peekLast 分别对应首尾操作;带 offer/poll/peek 前缀的方法失败时返回 false 或 null,而 add/remove/element 方法失败时抛异常。
- 从头部添加/移除:
addFirst(e)、pollFirst()(安全移除,空时返回null) - 从尾部添加/移除:
addLast(e)、pollLast() - 查看但不移除:
peekFirst()、peekLast() - 模拟栈行为:用
push(e)(等价于addFirst)、pop()(等价于removeFirst)
典型使用场景示例
比如实现滑动窗口最大值、回文判断、括号匹配或撤销操作等,都依赖双端操作能力。
- 滑动窗口:维护单调递减的
Deque<integer></integer>,头部始终是当前窗口最大值索引 - 回文检查:将字符串字符依次
addLast,再循环pollFirst和pollLast对比 - 撤销功能:用户操作存入
deque.addLast(op),撤销时op = deque.pollLast()
注意事项与常见陷阱
Deque 不是线程安全的,多线程环境下需额外同步;另外部分方法行为容易混淆,需特别注意。
-
remove()和poll()都移除并返回元素,但前者为空时抛NoSuchElementException,后者返回null -
element()和peek()都只查看不移除,但前者为空时抛异常,后者返回null -
ArrayDeque容量自动扩容,但初始容量可指定(如new ArrayDeque(16))以减少扩容开销 - 遍历时建议用增强 for 循环或迭代器,避免误用
get(i)(ArrayDeque不支持随机访问)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











