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)若是操做失敗,則返回特殊值(null
或false
,具體取決於操做),接口的常規結構以下表所示。java
操做類型 | 拋出異常 | 返回特殊值 |
---|---|---|
插入 | add(e) |
offer(e) |
移除 | remove() |
poll() |
檢查 | element() |
peek() |
隊列一般(但不必定)以FIFO(先進先出)方式對元素進行排序,優先級隊列除外,它們根據元素的值對元素進行排序 — 有關詳細信息,請參閱「對象排序」部分。不管使用什麼排序,隊列的頭部都是經過調用remove
或poll
移除的元素。在FIFO隊列中,全部新元素都插入隊列的尾部,其餘類型的隊列可能使用不一樣的放置規則,每一個Queue
實現都必須指定其排序屬性。編程
Queue
實現能夠限制它所擁有的元素數量,這樣的隊列被稱爲有界,java.util.concurrent
中的某些Queue
實現是有界的,但java.util
中的實現不是。segmentfault
Queue
從Collection
繼承的add
方法插入一個元素,除非它違反了隊列的容量限制,在這種狀況下它會拋出IllegalStateException
。offer
方法,僅用於有界隊列,與add
不一樣之處僅在於它經過返回false
來表示插入元素失敗。api
remove
和poll
方法都移除並返回隊列的頭部,確切地移除哪一個元素是隊列的排序策略的函數,僅當隊列爲空時,remove
和poll
方法的行爲纔有所不一樣,在這些狀況下,remove
拋出NoSuchElementException
,而poll
返回null
。併發
element
和peek
方法返回但不移除隊列的頭部,它們之間的差別與remove
和poll
的方式徹底相同:若是隊列爲空,則element
拋出NoSuchElementException
,而peek
返回null
。oracle
隊列實現一般不容許插入null
元素,爲實現Queue
而進行了改進的LinkedList
實現是一個例外,因爲歷史緣由,它容許null
元素,可是你應該避免利用它,由於null
被poll
和peek
方法用做特殊的返回值。函數
隊列實現一般不定義equals
和hashCode
方法的基於元素的版本,而是從Object
繼承基於標識的版本。命令行
Queue
接口不定義阻塞隊列方法,這在併發編程中很常見,這些等待元素出現或空間可用的方法在java.util.concurrent.BlockingQueue接口中定義,該接口擴展了Queue
。code
在如下示例程序中,隊列用於實現倒數計時器,隊列預先加載了從命令行上指定的數字到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; }