β

[集合框架] Queue 接口

Aptusource.orgAptusource.org 218 阅读

Queue 是队列的意思,Queue 接口继承自 Collection,常常用于预存储值参与后续的处理,除了继承 Collection 接口中的方法外,它还提供了自己的插入、删除和检查的方法。Queue 接口声明如下:

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

每个 Queue 中的方法都有两种形式:1)如果操作失败抛出异常;2)如果操作失败,返回特定的值(null 或者 false,取决于具体的操作)。这个接口的一般结构参看下表:

操作类型 抛出异常 返回特定值
插入 add(e) offer(e)
删除 remove() poll()
查看 element() peek()

大多数情况下(不是必要条件),Queue 都遵循先进先出原则(FIFO,first-in-first-out)。但也有例外,比如按照元素值来进行排序。但是无论使用什么排序规则,当调用 remove 或 poll 的时候,都是删除 Queue 的第一个元素。在 FIFO Queue 中,所有新增元素都排在 Queue 的尾部。其它类型的 Queue 新增元素可能插入到其它位置。每个 Queue 的实现都必须要指定它的排序属性。

有的 Queue 的实现限制了 Queue 中存放元素的个数,这种类型的 Queue 称为有界队列。在 java.util.concurrent 包中就有有界队列的实现。在 java.util 包中没有。

Queue 的 add 方法继承自 Collection,在向队列插入数据如果违反了队列的限制时,将会抛出 IllegalStateException 异常。Queue 的 offer 方法专门用于有界队列,不同于 add 方法,这个方法插入失败会返回 false。

remove 和 poll 方法都会删除并返回队列的第一个元素,具体删除哪个元素取决于队列的排序规则。remove 和 pull 方法不同的地方是当队列为空时,remove 方法会抛出 NoSuchElementException 异常,而 poll 方法会返回 null。

element 和 peek 方法会返回但不会删除队列的第一个元素,不同的地方是当队列为空时,element 方法会抛出 NoSuchElementException 异常,而 peek 方法会返回 null。

Queue 的实现通常不允许插入 null 值。LinkedList 是 Queue 的一个改进版本,它是个例外。基于历史的原因,这个类允许插入 null 值,但是你要避免这么做,因为 null 值在 poll 和 peek 方法中有特殊的含义。

Queue 接口中没有定义阻塞队列所需要的方法,这些方法通常在并发编程中需要用到。如果要使用阻塞队列,可以使用 java.util.concurrent.BlockingQueue,它继承自 Queue。

下面的例子使用了一个 Queue 用于倒计时计数器。这个队列根据命令行输入的参数从设置的数字到 0 预加载了所有的数字,并且按降序排列。然后,这些值会在间隔一秒时间后依次从队列移除并打印。这个程序可以不用 Queue 而达到相同的效果,这样做是为了解释队列如何预存储值参与随后的处理:

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

下面的代码使用了优先队列(PriorityQueue)来对集合中的元素排序,这个程序只是为了掩饰 PriorityQueue 的用法,其它情况下,排序应该使用 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;
}
作者:Aptusource.orgAptusource.org
最好的 Java 技术博客
原文地址:[集合框架] Queue 接口, 感谢原作者分享。
DWR ItsNat

发表评论