HOWTO · Java

Java 中的 Enqueue 和 Dequeue

了解 Java 中的入队和出队以及所有其他相关信息

本页内容

在 Java 中,入队会将元素添加到 FIFO 队列的尾部,出队则会移除队列头部的元素。Queue 接口定义了这些操作,LinkedList 是它的一种实现类。如果需要通过返回值判断插入是否成功,或队列头部是否有元素可取,可以使用 offer 和 poll。

队列与 FIFO

队列按先进先出(FIFO)的顺序处理元素:最先添加的值也会最先移除。元素从尾部添加,从头部移除或查看。当程序需要按照作业、事件或消息的到达顺序进行处理时,这种顺序很有用。

Java 集合框架中的 Queue 是一个接口。它定义了常见的队列操作,但不限定具体的存储方式。不同实现的容量限制和性能特征可能不同,因此应根据应用需求选择合适的实现,不要假设所有队列的行为都相同。

如需了解相关的顺序规则,请参阅 Java FIFO 队列指南。

入队与出队

**入队(enqueue)**是将元素添加到队列尾部的操作。**出队(dequeue)**是移除队列头部元素的操作。这两个名称描述的是队列操作,并不表示 Deque 接口等同于出队操作。Deque 是另一个 Java 接口,适用于支持从两端插入和移除元素的集合。

查看队列头部的元素时,也可以不将其移除。当代码需要判断接下来要处理什么,同时又要保持队列顺序不变时,这种方式很有用。

enqueue and dequeue java

Java 中的队列方法

添加元素时,如果队列接受该元素,add(E) 和 offer(E) 都会将其加入队列。两者对容量限制的处理不同:如果容量限制导致无法插入,add 会抛出 IllegalStateException,而 offer 会返回 false。无界队列可能没有固定容量,因此具体行为取决于所用的实现。

移除元素时,remove() 会取出并移除队列头部元素;如果队列为空,则抛出 NoSuchElementException。poll() 也会取出并移除头部元素,但队列中没有可移除的元素时会返回 null。如果队列为空属于调用方应通过返回值处理的正常情况,可以使用 poll()。

element() 和 peek() 会查看队列头部,但不会移除元素。队列为空时,element() 会抛出 NoSuchElementException,而 peek() 会返回 null。你可以根据需要,在这两种方法中选择通过异常明确报告问题,或通过特殊返回值表示没有元素。由于 poll() 和 peek() 使用 null 表示没有可用的头部元素,如果程序需要区分该结果和队列中存储的值,就应避免在队列中存放 null。

使用 LinkedList 实现入队和出队

下面的完整程序通过 Queue<String> 接口使用 LinkedList<String> 实现。程序添加两个值、查看队列头部,然后按 FIFO 顺序逐个移除这两个值。

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        queue.offer("First");
        queue.offer("Second");
        System.out.println("Head: " + queue.peek());
        System.out.println("Removed: " + queue.poll());
        System.out.println("Removed: " + queue.poll());
    }
}
Head: First
Removed: First
Removed: Second

记录的运行结果与上方所示输出一致。第一次查看会读取 First,但不会将其移除;随后两次调用 poll() 依次移除 First 和 Second。变量声明为 Queue<String>,因此代码只依赖所需的队列操作,具体实现则由 LinkedList 提供。如果其他 Queue 实现的容量和顺序行为符合应用需求,也可以替换使用。

enqueue and dequeue - queue interface

选择方法时,关键在于调用方需要怎样处理空队列和容量限制:如果返回值属于正常控制流程的一部分,请使用 offer、poll 和 peek;如果相应情况应作为异常传递给调用方,请使用 add、remove 和 element。