跳转到内容

Java Deque接口

来自代码酷

模板:Note

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倍。

graph LR A[Head Index] --> B[Element 1] B --> C[Element 2] C --> D[Tail Index]

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): capacitynew=capacityold×2

注意事项[编辑 | 编辑源代码]

  • 线程不安全:需手动同步或使用`Collections.synchronizedDeque()`。
  • 空元素限制:禁止插入`null`值(`LinkedList`允许)。
  • 初始容量:`ArrayDeque`建议预设足够容量避免频繁扩容。

模板:Tip

总结[编辑 | 编辑源代码]

Deque接口提供了灵活的双端操作能力,是Java集合框架中兼具队列和栈特性的核心组件。通过选择合适的实现类,可以优化特定场景下的性能表现。