arraydeque是java中基于循环数组实现的高效、线程不安全双端队列,既可作lifo栈(用push/pop/peek)又可作fifo队列(用offer/poll/peek),性能优于stack和linkedlist,且不支持null元素。

ArrayDeque 是 Java 中一个高效、线程不安全的双端队列实现,底层基于循环数组。它既能当栈(LIFO)用,也能当队列(FIFO)用,性能优于 Stack 和 LinkedList(尤其在大量操作时)。关键在于选择合适的方法组合。
当作栈使用(LIFO)
用 push()、pop()、peek() 这三个方法,语义清晰,行为与传统栈完全一致——所有操作都在队列**头部**进行。
-
push(e):在队首添加元素(等价于addFirst(e)) -
pop():移除并返回队首元素;若为空则抛出NoSuchElementException -
peek():仅查看队首元素,不移除;为空时返回null
示例:
ArrayDeque<integer> stack = new ArrayDeque(); stack.push(1); // [1] stack.push(2); // [2, 1] stack.push(3); // [3, 2, 1] System.out.println(stack.pop()); // 输出 3,栈变为 [2, 1] System.out.println(stack.peek()); // 输出 2,栈仍为 [2, 1]</integer>
当作队列使用(FIFO)
用 offer()、poll()、peek() 这组方法,符合队列规范——添加在**尾部**,移除从**头部**。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
offer(e):在队尾添加元素(等价于addLast(e)),成功返回true -
poll():移除并返回队首元素;为空时返回null(比remove()更安全) -
peek():查看队首元素,不移除;为空时返回null
示例:
ArrayDeque<string> queue = new ArrayDeque();
queue.offer("a"); // ["a"]
queue.offer("b"); // ["a", "b"]
queue.offer("c"); // ["a", "b", "c"]
System.out.println(queue.poll()); // 输出 "a",队列变为 ["b", "c"]
System.out.println(queue.peek()); // 输出 "b"</string>
避免混用方法导致逻辑混乱
同一个 ArrayDeque 实例不要交替调用栈和队列方法(比如一边 push() 一边 poll()),否则顺序难以预测。明确用途后统一使用对应方法集。
- 如果需要栈语义,只用
push/pop/peek - 如果需要队列语义,只用
offer/poll/peek - 注意:
peek()在两种模式下都指“看头”,但“头”的定义不同:栈的头是插入/弹出端(首),队列的头是出队端(也是首)——实际都是队首,所以行为一致
额外提示:容量与性能
ArrayDeque 没有固定容量限制,扩容时会自动翻倍(最小扩容至 16),因此无需预估大小。相比 LinkedList,它内存局部性更好,缓存命中率高;相比 ArrayList 的手动模拟栈,它支持高效的头插头删。
- 构造时可传初始容量(如
new ArrayDeque(32)),减少早期扩容开销 - 不支持
null元素(所有添加方法遇到null都抛NullPointerException) - 不是线程安全的,多线程需外部同步或改用
ConcurrentLinkedDeque
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










