Java容器之雙端隊(duì)列Deque

??DequeQueue的一個(gè)子接口,是Double Ended Queue的縮寫,顧名思義Deque是一個(gè)支持雙向檢索插入元素的雙向隊(duì)列,因此Deque既支持FIFO原則也支持LIFO原則的數(shù)據(jù)結(jié)構(gòu),Deque接口是一種比Stack和Queue更為豐富的抽象數(shù)據(jù)形式,因?yàn)樗瑫r(shí)實(shí)現(xiàn)了以上兩者

主要方法

1.jpeg

如圖此接口定義時(shí)在提供了雙端隊(duì)列兩端訪問元素的方法。提供插入、移除和檢查元素的方法。因?yàn)榇私涌诶^承了隊(duì)列接口Queue,所以其每種方法也存在兩種形式:一種形式在操作失敗時(shí)拋出異常,另一種形式返回一個(gè)特殊值(null 或 false,具體取決于操作)。

FIFO行為(當(dāng)隊(duì)列Queue使用)

將元素添加到雙端隊(duì)列的末尾,從雙端隊(duì)列的開頭移除元素。從 Queue 接口繼承的方法完全等效于 Deque 方法,如下表所示:

2.jpeg

LIFO行為(當(dāng)棧Stack使用)

在將雙端隊(duì)列用作堆棧時(shí),元素被推入雙端隊(duì)列的開頭并從雙端隊(duì)列開頭彈出。堆棧方法完全等效于 Deque 方法,如下表所示:

3.jpeg

方法說明如下:

4.jpeg

可以看出Deque在Queue的方法上新添了對(duì)隊(duì)列頭尾元素的操作,add,remove,get形式的方法會(huì)在有界隊(duì)列滿員和空隊(duì)列時(shí)拋出異常,offer,poll,peek形式的方法則會(huì)返回falsenull.

此外方法表中需要注意push = addFirst,pop = removeFirst,只是使用了不同的方法名體現(xiàn)隊(duì)列表示棧結(jié)構(gòu)時(shí)的特點(diǎn).

實(shí)現(xiàn)類

  1. LinkedList 大小可變的鏈表雙端隊(duì)列,允許元素為 null
  2. ArrayDeque 大下可變的數(shù)組雙端隊(duì)列,不允許 null
  3. LinkedBlockingDeque 如果隊(duì)列為空時(shí),獲取操作將會(huì)阻塞,直到有元素添加
  4. ConcurrentLinkedDeque 非阻塞線程安全列表

工作密取

??在 生產(chǎn)者-消費(fèi)者 模式中,所有消費(fèi)者都從一個(gè)工作隊(duì)列中取元素,一般使用阻塞隊(duì)列實(shí)現(xiàn);而在 工作密取 模式中,每個(gè)消費(fèi)者有其單獨(dú)的工作隊(duì)列,如果它完成了自己雙端隊(duì)列中的全部工作,那么它就可以從其他消費(fèi)者的雙端隊(duì)列末尾秘密地獲取工作。
??工作密取 模式 對(duì)比傳統(tǒng)的 生產(chǎn)者-消費(fèi)者 模式,更為靈活,因?yàn)?code>多個(gè)線程不會(huì)因?yàn)樵?code>同一個(gè)工作隊(duì)列中搶占內(nèi)容發(fā)生競(jìng)爭(zhēng)。在大多數(shù)時(shí)候,它們只是訪問自己的雙端隊(duì)列。即使需要訪問另一個(gè)隊(duì)列時(shí),也是從 隊(duì)列的尾部獲取工作,降低了隊(duì)列上的競(jìng)爭(zhēng)程度。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容