2025.1.4
ArrayDeque
ArrayDeque
是 Java 中的一个类,它实现了 Deque
接口,可以作为栈(Stack)或者队列(Queue)使用。ArrayDeque
是基于数组实现的,因此它具有更好的性能特性,特别是对于固定大小的操作集合,它比 LinkedList
更高效。
以下是 ArrayDeque
的一些基本使用方法:
初始化
1 2 3 4 5 6 7
| import java.util.ArrayDeque;
// 创建一个空的 ArrayDeque ArrayDeque<Integer> deque = new ArrayDeque<>();
// 创建一个带有初始元素的 ArrayDeque ArrayDeque<Integer> dequeWithElements = new ArrayDeque<>(Arrays.asList(1, 2, 3));
|
作为队列使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // 添加元素到队列尾部 deque.offer(1); deque.offer(2); deque.offer(3);
// 检查队列头部元素 Integer head = deque.peek(); // 返回队列头部元素,但不删除它
// 移除队列头部元素 Integer removedHead = deque.poll(); // 返回并移除队列头部元素
// 检查队列是否为空 boolean isEmpty = deque.isEmpty();
// 获取队列的大小 int size = deque.size();
|
作为栈使用
1 2 3 4 5 6 7 8 9 10
| // 将元素推入栈顶 deque.push(1); deque.push(2); deque.push(3);
// 查看栈顶元素 Integer top = deque.peek(); // 返回栈顶元素,但不删除它
// 移除栈顶元素 Integer poppedTop = deque.pop(); // 返回并移除栈顶元素
|
其他常用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // 检查是否包含某个元素 boolean contains = deque.contains(2);
// 清空队列/栈 deque.clear();
// 使用迭代器遍历 for (Integer item : deque) { System.out.println(item); }
// 或者使用增强的 for 循环 Iterator<Integer> iterator = deque.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
|
注意事项
ArrayDeque
不支持插入 null
元素,如果你尝试插入 null
,它将抛出 NullPointerException
。
ArrayDeque
没有容量限制,它会根据需要自动增长。
- 与
LinkedList
相比,ArrayDeque
在大多数操作上通常更快,特别是对于固定大小的操作集合。
使用 ArrayDeque
时,你应该根据你的具体需求来选择它作为队列还是栈。由于 ArrayDeque
实现了 Deque
接口,它可以很容易地在这两种数据结构之间切换。
LinkedList
LinkedList
在Java中实现了Queue
接口,因此它可以被当作队列使用。
1. 创建LinkedList
队列
要创建一个LinkedList
并将其用作队列,可以这样做:
1 2 3 4
| import java.util.Queue; import java.util.LinkedList;
Queue<String> queue = new LinkedList<>();
|
2. 向队列中添加元素
可以使用add()
或offer()
方法向队列中添加元素。add()
方法在添加失败时抛出异常,而offer()
方法在添加失败时返回false
。
1 2
| queue.add("Element1"); // 添加元素到队列尾部 queue.offer("Element2"); // 添加元素到队列尾部
|
3. 从队列中移除元素
可以使用remove()
或poll()
方法从队列中移除元素。remove()
方法在队列为空时抛出异常,而poll()
方法在队列为空时返回null
。
1 2
| String removedElement = queue.remove(); // 移除队列头部的元素 String polledElement = queue.poll(); // 移除队列头部的元素,如果队列为空,返回null
|
4. 查看队列头部的元素
可以使用element()
或peek()
方法查看队列头部的元素。element()
方法在队列为空时抛出异常,而peek()
方法在队列为空时返回null
。
1 2
| String headElement = queue.element(); // 查看队列头部的元素,不删除 String peekedElement = queue.peek(); // 查看队列头部的元素,不删除,如果队列为空,返回null
|
5. 完整示例
以下是一个使用LinkedList
作为队列的完整示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import java.util.Queue; import java.util.LinkedList;
public class LinkedListQueueExample { public static void main(String[] args) { Queue<String> queue = new LinkedList<>();
// 添加元素 queue.offer("Apple"); queue.offer("Banana"); queue.offer("Cherry");
// 查看队列头部元素 System.out.println("Queue head: " + queue.peek()); // 输出: Queue head: Apple
// 移除并打印所有元素 while (!queue.isEmpty()) { String element = queue.poll(); System.out.println("Removed: " + element); }
// 队列现在为空 System.out.println("Is the queue empty? " + queue.isEmpty()); // 输出: Is the queue empty? true } }
|
在这个例子中,我们创建了一个LinkedList
队列,添加了三个元素,然后逐个移除并打印它们。最后,我们检查队列是否为空。