精通 Java ArrayDeque:全面指南与栈实现实战
Java ArrayDeque
本指南详解 ArrayDeque 类、其方法及实战示例——包括如何将其用作栈。
在 Java 中,ArrayDeque 以可调整大小的数组为底层实现队列与双端队列数据结构。
ArrayDeque 实现的接口
ArrayDeque 类实现以下接口:
- Java Queue 接口
- Java Deque 接口

创建 ArrayDeque
先导入包:
import java.util.ArrayDeque;
实例化带泛型的双端队列:
ArrayDeque<Type> deque = new ArrayDeque<>();
示例:
// String 双端队列
ArrayDeque<String> animals = new ArrayDeque<>();
// Integer 双端队列
ArrayDeque<Integer> ages = new ArrayDeque<>();
ArrayDeque 的关键方法
插入元素
1. 使用 add()、addFirst()、addLast()
add(E e)— 将e追加到尾部。addFirst(E e)— 在头部插入e。addLast(E e)— 等同于add()。
注意: 若双端队列已满,这些方法抛出 IllegalStateException。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.addFirst("Cat");
animals.addLast("Horse");
System.out.println("ArrayDeque: " + animals);
输出
ArrayDeque: [Cat, Dog, Horse]
2. 使用 offer()、offerFirst()、offerLast()
offer(E e)— 追加到尾部,成功返回true。offerFirst(E e)— 在头部插入。offerLast(E e)— 等同于offer()。
注意: 这些方法在队列满时返回 false。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.offer("Dog");
animals.offerFirst("Cat");
animals.offerLast("Horse");
System.out.println("ArrayDeque: " + animals);
输出
ArrayDeque: [Cat, Dog, Horse]
访问元素
1. getFirst() 与 getLast()
getFirst()— 返回头部元素。getLast()— 返回尾部元素。
注意: 双端队列为空时抛出 NoSuchElementException。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("首元素: " + animals.getFirst());
System.out.println("尾元素: " + animals.getLast());
输出
ArrayDeque: [Dog, Cat, Horse] 首元素: Dog 尾元素: Horse
2. peek()、peekFirst()、peekLast()
peek()— 获取但不移除头部元素。peekFirst()— 等同于peek()。peekLast()— 获取尾部元素。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("头部元素: " + animals.peek());
System.out.println("首元素: " + animals.peekFirst());
System.out.println("尾元素: " + animals.peekLast());
输出
ArrayDeque: [Dog, Cat, Horse] 头部元素: Dog 首元素: Dog 尾元素: Horse
注意: 双端队列为空时,peek() 等返回 null 而非抛异常。
移除元素
1. remove()、removeFirst()、removeLast()
remove()— 移除并返回头部元素。removeFirst()— 等同于remove()。removeLast()— 移除并返回尾部元素。remove(Object o)— 移除首次出现的o(若存在)。
注意: 空时或 remove(o) 未找到时抛 NoSuchElementException。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("移除的元素: " + animals.remove());
System.out.println("新 ArrayDeque: " + animals);
System.out.println("移除首元素: " + animals.removeFirst());
System.out.println("移除尾元素: " + animals.removeLast());
输出
ArrayDeque: [Dog, Cat, Cow, Horse] 移除的元素: Dog 新 ArrayDeque: [Cat, Cow, Horse] 移除首元素: Cat 移除尾元素: Horse
2. poll()、pollFirst()、pollLast()
poll()— 移除并返回头部元素,空时返回null。pollFirst()— 等同于poll()。pollLast()— 移除并返回尾部元素。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("移除的元素: " + animals.poll());
System.out.println("新 ArrayDeque: " + animals);
System.out.println("移除首元素: " + animals.pollFirst());
System.out.println("移除尾元素: " + animals.pollLast());
输出
ArrayDeque: [Dog, Cat, Cow, Horse] 移除的元素: Dog 新 ArrayDeque: [Cat, Cow, Horse] 移除首元素: Cat 移除尾元素: Horse
3. clear()
清空整个双端队列。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
animals.clear();
System.out.println("新 ArrayDeque: " + animals);
输出
ArrayDeque: [Dog, Cat, Horse] 新 ArrayDeque: []
遍历 ArrayDeque
iterator()— 正向迭代器。descendingIterator()— 反向迭代器。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.print("ArrayDeque: ");
Iterator<String> it = animals.iterator();
while(it.hasNext()) {
System.out.print(it.next() + ", ");
}
System.out.print("\n反向遍历: ");
Iterator<String> rev = animals.descendingIterator();
while(rev.hasNext()) {
System.out.print(rev.next() + ", ");
}
输出
ArrayDeque: [Dog, Cat, Horse] 反向遍历: [Horse, Cat, Dog]
其他常用方法
| 方法 | 说明 |
|---|---|
element() | 获取但不移除头部元素 |
contains(Object o) | 判断是否包含 o;存在返回 true |
size() | 双端队列元素数量 |
toArray() | 转换为数组 |
clone() | 创建浅拷贝 |
将 ArrayDeque 用作栈
对于 LIFO 行为,ArrayDeque 优于 Stack,因其性能更好且无遗留同步开销。
栈风格方法:
push(E e)— 添加到头部。peek()— 获取栈顶元素不移除。pop()— 移除并返回栈顶元素。
ArrayDeque<String> stack = new ArrayDeque<>();
stack.push("Dog");
stack.push("Cat");
stack.push("Horse");
System.out.println("Stack: " + stack);
System.out.println("访问的元素: " + stack.peek());
System.out.println("移除的元素: " + stack.pop());
输出
Stack: [Horse, Cat, Dog] 访问的元素: Horse 移除的元素: Horse
ArrayDeque 与 LinkedList 对比
两者均实现 Deque,但存在差异:
LinkedList允许null元素;ArrayDeque不允许。- LinkedList 节点存指针,内存占用更大。
- 队列/双端队列工作负载下,
ArrayDeque通常性能优于LinkedList。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- Java break 语句:用法、时机与标签 break 详解
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比