隊列是只能在其上執行操作的對象的集合兩端的隊列。
隊列有兩個末端,稱為頭和尾。
在簡單隊列中,對象被添加到尾部并從頭部刪除并首先刪除首先添加的對象。
Java Collections Framework支持以下類型的隊列。
• 簡單的隊列允許在尾部插入和從頭部移除。
• 優先級隊列為每個元素分配優先級,并允許從隊列中刪除具有最高優先級的元素。
• 延遲隊列向每個元素添加延遲,并僅在其延遲已過去時刪除該元素。
• 雙端隊列允許其元件從頭部和尾部插入和移除。
• 阻塞隊列阻塞線程,當線程已滿時向其添加元素,當線程為空時,它阻止線程從中刪除元素。
• 傳輸隊列是阻塞隊列,其中對象的切換發生在生產者線程和消費者線程之間。
• 阻塞雙端隊列是雙端隊列和阻塞隊列的組合。
• 隊列可以定義為有序列表,它允許在一端執行插入操作,稱為REAR,刪除操作在另一端執行,稱為FRONT。
• 隊列被稱為先進先出列表。
• 例如,排隊等候鐵路車票的人隊列。
由于隊列以先進先出的方式執行操作,這對于操作的排序是相當公平的。 隊列的各種應用如下所述。
• 隊列被廣泛用作單個共享資源(如打印機,磁盤,CPU)的等待列表。
• 隊列用于異步數據傳輸(例如,數據不以兩個進程之間的相同速率傳輸)。 管道,文件IO,套接字。
• 隊列在大多數應用程序中用作緩沖區,如MP3媒體播放器,CD播放器等。
• 隊列用于維護媒體播放器中的播放列表,以便添加和刪除播放列表中的歌曲。
• 隊列在操作系統中用于處理中斷。
時間復雜性 |
訪問 |
搜索 |
插入 |
刪除 |
---|---|---|---|---|
平均情況 |
θ(n) |
θ(n) |
θ(1) |
θ(1) |
最壞情況 |
θ(n) |
θ(n) |
θ(1) |
θ(1) |
簡單隊列由 Queue 接口的實例表示。
隊列允許您執行三個基本操作:
• 從尾部添加元素
• 從其頭部移除元素
• 在元素頂部審查
Queue接口為三個操作中的每一個定義了兩個方法。如果操作不可能,一個方法拋出異常,另一個方法方法返回false或null以指示失敗。
方法 |
描述 |
---|---|
boolean add(E e) |
如果可能,向隊列中添加一個元素。否則,它拋出異常。 |
boolean offer(E e) |
如果不能添加元素,則將元素添加到隊列中,而不拋出異常。 它在失敗時返回false,在成功時返回true。 |
E remove() |
刪除隊列的頭。如果隊列為空,它會拋出異常。此方法返回已移除的項目。 |
E poll() |
從隊列中刪除元素。如果隊列為空而不是拋出異常,則返回null。 |
Eelement() |
偷看隊列的頭,而不從隊列中刪除它。 如果隊列為空,它會拋出異常。 |
E peek() |
查看隊列,如果隊列為空而不是拋出異常,則返回null。 |
LinkedList和PriorityQueue是Queue接口的兩個實現類。LinkedList還實現了List接口。
例子
以下代碼顯示如何將鏈表用作FIFO隊列。
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("Java");
// offer() will work the same as add()
queue.offer("SQL");
queue.offer("CSS");
queue.offer("XML");
System.out.println("Queue: " + queue);
// Let"s remove elements until the queue is empty
while (queue.peek() != null) {
System.out.println("Head Element: " + queue.peek());
queue.remove();
System.out.println("Removed one element from Queue");
System.out.println("Queue: " + queue);
}
System.out.println("queue.isEmpty(): " + queue.isEmpty());
System.out.println("queue.peek(): " + queue.peek());
System.out.println("queue.poll(): " + queue.poll());
try {
String str = queue.element();
System.out.println("queue.element(): " + str);
str = queue.remove();
System.out.println("queue.remove(): " + str);
} catch (NoSuchElementException e) {
System.out.println("queue.remove(): Queue is empty.");
}
}
}
上面的代碼生成以下結果。