Java Deque接口
外观
Java Deque接口(双端队列,Double Ended Queue)是Java集合框架中的一个重要接口,它扩展了Queue接口,允许在队列的头部和尾部高效地插入、删除和访问元素。Deque是“双端队列”的缩写,支持先进先出(FIFO)和后进先出(LIFO)两种操作模式,因此既可以作为队列使用,也可以作为栈使用。
概述[编辑 | 编辑源代码]
Deque接口定义在`java.util`包中,自Java 6引入。它提供了两组操作方法:
- 队列操作(FIFO):如`offer()`、`poll()`、`peek()`。
- 栈操作(LIFO):如`push()`、`pop()`。
Deque的主要实现类包括:
- `ArrayDeque`:基于动态数组实现,性能高效。
- `LinkedList`:基于链表实现,支持所有Deque操作。
核心方法[编辑 | 编辑源代码]
以下是Deque接口的关键方法:
方法 | 描述 | 抛出异常版本 | 返回特殊值版本 |
---|---|---|---|
插入头部 | `addFirst(e)` | `offerFirst(e)` | |
插入尾部 | `addLast(e)` | `offerLast(e)` | |
移除头部 | `removeFirst()` | `pollFirst()` | |
移除尾部 | `removeLast()` | `pollLast()` | |
查看头部 | `getFirst()` | `peekFirst()` | |
查看尾部 | `getLast()` | `peekLast()` |
代码示例[编辑 | 编辑源代码]
以下示例展示如何使用`ArrayDeque`实现栈和队列:
import java.util.ArrayDeque;
import java.util.Deque;
public class DequeExample {
public static void main(String[] args) {
// 作为栈使用(LIFO)
Deque<String> stack = new ArrayDeque<>();
stack.push("First");
stack.push("Second");
System.out.println(stack.pop()); // 输出: Second
// 作为队列使用(FIFO)
Deque<String> queue = new ArrayDeque<>();
queue.offer("First");
queue.offer("Second");
System.out.println(queue.poll()); // 输出: First
}
}
实现原理[编辑 | 编辑源代码]
ArrayDeque[编辑 | 编辑源代码]
`ArrayDeque`使用循环数组存储元素,默认初始容量为16。当数组满时自动扩容至原来的2倍。
LinkedList[编辑 | 编辑源代码]
`LinkedList`通过双向链表实现,每个节点包含前驱和后继指针。
实际应用[编辑 | 编辑源代码]
1. 撤销操作:使用Deque保存操作历史,`push()`记录操作,`pop()`撤销。 2. 滑动窗口最大值:算法中通过Deque高效维护窗口极值。 3. 任务调度:混合使用FIFO和LIFO策略管理任务。
性能比较[编辑 | 编辑源代码]
操作 | ArrayDeque | LinkedList |
---|---|---|
插入/删除头部 | O(1) | O(1) |
插入/删除尾部 | O(1) | O(1) |
随机访问 | O(n) | O(n) |
数学表示[编辑 | 编辑源代码]
Deque的容量增长公式(ArrayDeque):
注意事项[编辑 | 编辑源代码]
- 线程不安全:需手动同步或使用`Collections.synchronizedDeque()`。
- 空元素限制:禁止插入`null`值(`LinkedList`允许)。
- 初始容量:`ArrayDeque`建议预设足够容量避免频繁扩容。
总结[编辑 | 编辑源代码]
Deque接口提供了灵活的双端操作能力,是Java集合框架中兼具队列和栈特性的核心组件。通过选择合适的实现类,可以优化特定场景下的性能表现。