Java Deque 接口

Deque 接口定义了双端队列数据结构的功能。在本教程中,我们将了解 Deque 接口、如何使用 Deque 接口以及它的方法。

在本教程中,我们将了解 Deque 接口、如何使用它以及它的方法。

Java 集合框架的 Deque 接口定义了双端队列数据结构的功能。它扩展了 Queue 接口。

双端队列工作原理

在常规队列中,元素从队尾加入队列并且从队头离开队列。但是,在双端队列中,我们可以同时从队头和队尾插入和删除元素。

deque(双端队列)数据结构的工作原理

实现 Deque 的类

为了使用 Deque 接口的功能,我们需要使用它的实现类:

ArrayDeque 和 Linkedlist 实现了 Deque 接口

如何使用 Deque?

在 Java 中,我们首先导入 java.util.Deque 接口,然后按照如下的方式创建双端队列:

// 使用 ArrayDeque 创建双端队列
Deque<String> animal1 = new ArrayDeque<>();
// 使用 LinkedList 创建双端队列
Deque<String> animal2 = new LinkedList<>();

在这里,我们已经分别使用 ArrayDequeLinkedList 创建了 2 个双端队列对象。这些对象可以使用 Deque 接口定义的所有方法。

双端队列的方法

由于 Deque 扩展了 Queue 接口,所以继承了 Queue 接口的所有方法。

除了 Queue 接口中可用的方法外, Deque 接口还定义了以下抽象方法:

  • addFirst() - 在双端队列的队头添加指定的元素。如果双端队列已满,则抛出异常。
  • addLast() - 在双端队列的队尾添加指定的元素。如果双端队列已满,则抛出异常。
  • offerFirst() - 在双端队列的队头添加指定的元素。如果双端队列已满则返回 false
  • offerLast() - 在双端队列的队尾添加指定的元素。如果双端队列已满则返回 false
  • getFirst() - 返回双端队列的队头元素。如果双端队列为空,则抛出异常。
  • getLast() - 返回双端队列的队尾元素。如果双端队列为空,则抛出异常。
  • peekFirst() - 返回双端队列的队头元素。如果双端队列为空则返回 null
  • peekLast() - 返回双端队列的队尾元素。如果双端队列为空则返回 null
  • removeFirst() - 删除并返回双端队列的队头元素。如果双端队列为空,则抛出异常。
  • removeLast() - 删除并返回双端队列的队尾元素。如果双端队列为空,则抛出异常。
  • pollFirst() - 删除并返回双端队列的队头元素。如果双端队列为空则返回 null
  • pollLast() - 删除并返回双端队列的队尾元素。如果双端队列为空则返回 null

双端队列作为堆栈数据结构

Java 的集合框架的类提供了 Stack 类作为堆栈的实现,但是一般不建议使用 Stack 类,因为 Stack 的方法是同步的,并且效率不高。

Deque 接口同样定义了实现堆栈的方法:

  • push() - 在双端队列的队头添加一个元素
  • pop() - 从双端队列的队头删除一个元素
  • peek() - 从双端队列队头返回一个元素

ArrayDeque

ArrayDeque 类使用数组完全实现了 Deque 接口。当 ArrayDeque 作为队列使用的时候,比 LinkedList 性能好;当作为栈使用的时候,比 Stack 性能好。

以下是使用 ArrayDeque 作为双端队列使用的示例:

import java.util.Deque;
import java.util.ArrayDeque;

public class Main {

  public static void main(String[] args) {
    // 使用 ArrayDeque 创建双端队列
    Deque<Integer> numbers = new ArrayDeque<>();

    // 添加元素到双端队列
    numbers.offer(1);
    numbers.offerLast(2);
    numbers.offerFirst(3);
    System.out.println("Deque: " + numbers);

    // 访问双端队列中的元素
    int firstElement = numbers.peekFirst();
    System.out.println("First Element: " + firstElement);

    int lastElement = numbers.peekLast();
    System.out.println("Last Element: " + lastElement);

    // 从双端队列中删除元素
    int removedNumber1 = numbers.pollFirst();
    System.out.println("Removed First Element: " + removedNumber1);

    int removedNumber2 = numbers.pollLast();
    System.out.println("Removed Last Element: " + removedNumber2);

    System.out.println("Updated Deque: " + numbers);
  }
}

输出

Deque: [3, 1, 2]
First Element: 3
Last Element: 2
Removed First Element: 3
Removed Last Element: 2
Updated Deque: [1]

要了解更多信息,请访问 Java ArrayDeque 类 章节。