Java Deque接口
什么是Deque?
Deque(发音为"deck")是"Double Ended Queue"(双端队列)的缩写,代表一种特殊类型的队列,允许在两端进行元素的插入和删除操作。Java中的Deque
接口继承自Queue
接口,并提供了更丰富的操作方法。
与传统的队列(Queue)只能在一端添加元素、另一端移除元素不同,Deque可以:
- 在队列头部和尾部都可以添加元素
- 在队列头部和尾部都可以移除元素
- 可以查看队列两端的元素而不移除它们
这种灵活性使得Deque既可以用作队列(FIFO先进先出),也可以用作栈(LIFO后进先出)。
Deque接口的主要方法
Deque接口包含了丰富的方法,可以分为以下几类:
插入操作
方法 | 描述 | 特殊情况处理 |
---|---|---|
addFirst(E e) | 在队列头部添加元素 | 如果空间不足,抛出异常 |
offerFirst(E e) | 在队列头部添加元素 | 如果空间不足,返回false |
addLast(E e) | 在队列尾部添加元素 | 如果空间不足,抛出异常 |
offerLast(E e) | 在队列尾部添加元素 | 如果空间不足,返回false |
移除操作
方法 | 描述 | 特殊情况处理 |
---|---|---|
removeFirst() | 移除并返回队列头部的元素 | 如果队列为空,抛出异常 |
pollFirst() | 移除并返回队列头部的元素 | 如果队列为空,返回null |
removeLast() | 移除并返回队列尾部的元素 | 如果队列为空,抛出异常 |
pollLast() | 移除并返回队列尾部的元素 | 如果队列为空,返回null |
查看操作
方法 | 描述 | 特殊情况处理 |
---|---|---|
getFirst() | 获取但不移除队列头部的元素 | 如果队列为空,抛出异常 |
peekFirst() | 获取但不移除队列头部的元素 | 如果队列为空,返回null |
getLast() | 获取但不移除队列尾部的元素 | 如果队列为空,抛出异常 |
peekLast() | 获取但不移除队列尾部的元素 | 如果队列为空,返回null |
队列/栈操作方法
Deque还提供了标准的队列和栈操作方法:
队列方法(FIFO):
add(E e)
- 等同于addLast(e)
offer(E e)
- 等同于offerLast(e)
remove()
- 等同于removeFirst()
poll()
- 等同于pollFirst()
element()
- 等同于getFirst()
peek()
- 等同于peekFirst()
栈方法(LIFO):
push(E e)
- 等同于addFirst(e)
pop()
- 等同于removeFirst()
peek()
- 等同于peekFirst()
Deque的主要实现类
Java提供了两个主要的Deque接口实现:
- ArrayDeque:基于可调整大小的数组实现的双端队列,无容量限制。
- LinkedList:基于双向链表实现的双端队列,同时实现了List接口。
ArrayDeque 特点
- 没有容量限制(会根据需要扩容)
- 不允许null元素
- 非线程安全
- 作为栈使用时比Stack类更快
- 作为队列使用时比LinkedList更快
- 随机访问元素的效率低于ArrayList
LinkedList 特点
- 同时实现了List和Deque接口
- 允许null元素
- 非线程安全
- 相比ArrayDeque,插入和删 除操作有时更高效
- 需要更多的内存空间
代码示例
创建和基本操作
import java.util.ArrayDeque;
import java.util.Deque;
public class DequeExample {
public static void main(String[] args) {
// 创建Deque实例
Deque<String> deque = new ArrayDeque<>();
// 添加元素到两端
deque.addFirst("First");
deque.addLast("Last");
// 在两端之间添加元素
deque.add("Middle"); // 等同于addLast
System.out.println("Deque内容: " + deque);
// 查看两端元素但不移除
System.out.println("第一个元素: " + deque.getFirst());
System.out.println("最后一个元素: " + deque.getLast());
// 移除元素
String removedFirst = deque.removeFirst();
String removedLast = deque.removeLast();
System.out.println("移除的第一个元素: " + removedFirst);
System.out.println("移除的最后一个元素: " + removedLast);
System.out.println("移除后Deque内容: " + deque);
}
}
输出:
Deque内容: [First, Middle, Last]
第一个元素: First
最后一个元素: Last
移除的第一个元素: First
移除的最后一个元素: Last
移除后Deque内容: [Middle]