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接口

相關文章
相關標籤/搜索