亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

精通 Java ArrayDeque:全面指南与栈实现实战

Java ArrayDeque

本指南详解 ArrayDeque 类、其方法及实战示例——包括如何将其用作栈。

在 Java 中,ArrayDeque 以可调整大小的数组为底层实现队列与双端队列数据结构。


ArrayDeque 实现的接口

ArrayDeque 类实现以下接口:

精通 Java ArrayDeque:全面指南与栈实现实战


创建 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()

注意: 若双端队列已满,这些方法抛出 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()

注意: 这些方法在队列满时返回 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()

注意: 双端队列为空时抛出 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()

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(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()

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

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,因其性能更好且无遗留同步开销。

栈风格方法:

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,但存在差异:


java

  1. 精通 Java 运算符:类型、语法与实战示例
  2. Java 注释:类型、用法与最佳实践
  3. 精通 Java if…else:控制流全解析
  4. 精通 Java 增强 for 循环:语法、示例与最佳实践
  5. Java break 语句:用法、时机与标签 break 详解
  6. 精通 Java 字符串:创建、方法与最佳实践
  7. 精通 Java 接口:概念、实现与最佳实践
  8. 精通 Java 匿名内部类:定义、语法与实战示例
  9. 精通 Java Try-With-Resources:自动资源管理详解
  10. Java 注解详解:类型、放置位置与实战示例
  11. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  12. 深入理解 Java Vector:用法、特性及与 ArrayList 的对比