队列interface

Queue是用于在处理之前保存元素的集合。除了基本的Collection操作之外,队列还提供其他插入,移除和检查操作。 Queueinterface如下。

public interface Queue<E> extends Collection<E> {
    E element();
    boolean offer(E e);
    E peek();
    E poll();
    E remove();
}

每个Queue方法都以两种形式存在:(1)一种在操作失败时引发异常,(2)另一种在操作失败时返回一个特殊值(nullfalse,具体取决于操作)。下表中说明了interface的常规结构。

*队列interface结构 *

操作类型Throws exception返回特殊值
Insertadd(e)offer(e)
Removeremove()poll()
Examineelement()peek()

队列通常但不一定以 FIFO(先进先出)的方式对元素进行排序。优先队列除外,它们根据元素的值对元素进行排序(有关详细信息,请参见Object Ordering部分)。无论使用哪种排序,队列的开头都是可以通过调用removepoll删除的元素。在 FIFO 队列中,所有新元素都插入到队列的尾部。其他种类的队列可能使用不同的放置规则。每个Queue实现都必须指定其排序属性。

Queue实现有可能限制其持有的元素数量;这样的队列称为有界队列。 java.util.concurrent中的某些Queue实现是有界的,但java.util中的某些实现不受限制。

Queue继承自Collectionadd方法插入一个元素,除非该元素违反队列的容量限制,在这种情况下它将抛出IllegalStateExceptionoffer方法仅用于有界队列,它与add的不同之处仅在于它表示无法通过返回false来插入元素。

removepoll方法都删除并返回队列的开头。究竟要删除哪个元素是队列的排序策略的函数。仅当队列为空时,removepoll方法的行为不同。在这种情况下,remove抛出NoSuchElementException,而poll返回null

elementpeek方法返回但不删除队列的开头。它们以与removepoll完全相同的方式彼此不同:如果队列为空,则element抛出NoSuchElementException,而peek返回null

Queue实现通常不允许插入null元素。为实现Queue而改装的LinkedList实现是一个 exception。出于历史原因,它允许使用null元素,但是您应避免利用它,因为pollpeek方法将null用作特殊的返回值。

队列实现通常不定义equalshashCode方法的基于元素的版本,而是从Object继承基于身份的版本。

Queueinterface没有定义并发编程中常见的阻塞队列方法。这些方法 await 元素出现或空间可用,它们在扩展Queue的interfacejava.util.concurrent.BlockingQueue中定义。

在以下示例程序中,队列用于实现倒数计时器。从命令行指定的数字到队列中的所有整数值均按降序预加载到队列中。然后,将值从队列中删除并以一秒钟的间隔打印。该程序是人为的,因为不使用队列执行相同的操作会更自然,但是它说明了在后续处理之前使用队列来存储元素。

import java.util.*;

public class Countdown {
    public static void main(String[] args) throws InterruptedException {
        int time = Integer.parseInt(args[0]);
        Queue<Integer> queue = new LinkedList<Integer>();

        for (int i = time; i >= 0; i--)
            queue.add(i);

        while (!queue.isEmpty()) {
            System.out.println(queue.remove());
            Thread.sleep(1000);
        }
    }
}

在以下示例中,优先级队列用于对元素集合进行排序。同样,该程序是人为的,因为没有理由使用Collections中提供的sort方法,但是它说明了优先级队列的行为。

static <E> List<E> heapSort(Collection<E> c) {
    Queue<E> queue = new PriorityQueue<E>(c);
    List<E> result = new ArrayList<E>();

    while (!queue.isEmpty())
        result.add(queue.remove());

    return result;
}