Java™ 教程(Queue接口)

Queue接口

Queue是在处理以前保存元素的集合,除了基本的Collection操做外,队列还提供额外的插入、删除和检查操做,Queue接口以下。html

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

每一个Queue方法都有两种形式:(1)若是操做失败则抛出异常,(2)若是操做失败,则返回特殊值(nullfalse,具体取决于操做),接口的常规结构以下表所示。java

操做类型 抛出异常 返回特殊值
插入 add(e) offer(e)
移除 remove() poll()
检查 element() peek()

队列一般(但不必定)以FIFO(先进先出)方式对元素进行排序,优先级队列除外,它们根据元素的值对元素进行排序 — 有关详细信息,请参阅“对象排序”部分。不管使用什么排序,队列的头部都是经过调用removepoll移除的元素。在FIFO队列中,全部新元素都插入队列的尾部,其余类型的队列可能使用不一样的放置规则,每一个Queue实现都必须指定其排序属性。编程

Queue实现能够限制它所拥有的元素数量,这样的队列被称为有界,java.util.concurrent中的某些Queue实现是有界的,但java.util中的实现不是。segmentfault

QueueCollection继承的add方法插入一个元素,除非它违反了队列的容量限制,在这种状况下它会抛出IllegalStateExceptionoffer方法,仅用于有界队列,与add不一样之处仅在于它经过返回false来表示插入元素失败。api

removepoll方法都移除并返回队列的头部,确切地移除哪一个元素是队列的排序策略的函数,仅当队列为空时,removepoll方法的行为才有所不一样,在这些状况下,remove抛出NoSuchElementException,而poll返回null并发

elementpeek方法返回但不移除队列的头部,它们之间的差别与removepoll的方式彻底相同:若是队列为空,则element抛出NoSuchElementException,而peek返回nulloracle

队列实现一般不容许插入null元素,为实现Queue而进行了改进的LinkedList实现是一个例外,因为历史缘由,它容许null元素,可是你应该避免利用它,由于nullpollpeek方法用做特殊的返回值。函数

队列实现一般不定义equalshashCode方法的基于元素的版本,而是从Object继承基于标识的版本。命令行

Queue接口不定义阻塞队列方法,这在并发编程中很常见,这些等待元素出现或空间可用的方法在java.util.concurrent.BlockingQueue接口中定义,该接口扩展了Queuecode

在如下示例程序中,队列用于实现倒数计时器,队列预先加载了从命令行上指定的数字到0的全部整数值,按降序排列,而后,从队列中删除值并以一秒的间隔打印。该程序是人为的,由于在不使用队列的状况下执行相同的操做会更天然,但它说明了在后续处理以前使用队列来存储元素。

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);
        }
    }
}

在如下示例中,优先级队列用于对元素集合进行排序,一样,这个程序是人为的,由于没有理由使用它来支持集合中提供的排序方法,但它说明了优先级队列的行为。

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;
}

上一篇:List接口

下一篇:Deque接口

相关文章
相关标签/搜索