Queue解析

01

概述

佇列(Queue):一種只允許在一端進行插入,在另一端進行刪除的線性表結構。執行插入的一端叫隊尾,允許刪除的一端叫隊頭,與LIFO 的棧不同,佇列是一種FIFO表。Queue介面與List、Set同一級別,都是繼承了Collection介面。

Queue解析

佇列的底層結構只有兩種, 陣列Array, 連結串列Linked。

但是呢,陣列是比連結串列快的,因為陣列內元素的記憶體地址是連續的。而且陣列的容量是有限的, 相對來說發生記憶體溢位的風險會小很多。

實現一個佇列,選擇儲存結構的優先順序是:Linked < Array。

02

正文

非阻塞佇列:PriorityQueue 和 ConcurrentLinkedQueue

PriorityQueue 類實質上維護了一個有序列表。加入到 Queue 中的元素根據它們的天然排序(透過其java。util。Comparable 實現)或者根據傳遞給建構函式的 java。util。Comparator 實現來定位。

ConcurrentLinkedQueue 是基於連結節點的、執行緒安全的佇列。併發訪問不需要同步。因為它在佇列的尾部新增元素並從頭部刪除它們,所以只要不需要知道佇列的大 小,ConcurrentLinkedQueue 對公共集合的共享訪問就可以工作得很好。收集關於佇列大小的資訊會很慢,需要遍歷佇列。

實現阻塞介面的佇列:

五個阻塞佇列類。它實質上就是一種帶有一點扭曲的 FIFO 資料結構。不是立即從佇列中新增或者刪除元素,執行緒執行操作阻塞,直到有空間或者元素可用。

ArrayBlockingQueue

:一個由陣列支援的有界佇列。

LinkedBlockingQueue

:一個由連結節點支援的可選有界佇列。

PriorityBlockingQueue

:一個由優先順序堆支援的無界優先順序佇列。

DelayQueue

:一個由優先順序堆支援的、基於時間的排程佇列。

SynchronousQueue

:一個利用 BlockingQueue 介面的簡單聚集(rendezvous)機制。

雙端佇列:

LinkedList:

大小可變的連結串列雙端佇列,允許元素為插入null。

ArrayDeque:

大小可變的陣列雙端佇列,不允許插入null。

ConcurrentLinkedDeque:

大小可變且執行緒安全的連結串列雙端佇列,非阻塞,不允許插入null。

LinkedBlockingDeque:

為執行緒安全的雙端佇列,在佇列為空的情況下,獲取操作將會阻塞,直到有元素新增。

注意:LinkedList 和 ArrayDeque 是執行緒不安全的容器。

ArrayDeque是個可變陣列,它是在Java 6之後新新增的,而LinkedList是一種連結串列結構的list。LinkedList要比ArrayDeque更加靈活,因為它也實現了List介面的所有操作,並且可以插入null元素,這在ArrayDeque中是不允許的。

Queue解析

END