深入了解雙端隊列Deque

Deque的類圖

Deque的類圖

由上圖可知Deque在Java中以接口的形式存在,同時Deque還繼承Queue(隊列)的接口。


Queue隊列

隊列是一種特殊的線性容器,它是一種先進先出(FIFO)的數(shù)據(jù)結構。

它只允許在容器的頭部進行刪除操作,而在表的后端進行插入操作。進行插入操作的端成為隊尾,進行刪除操作的端稱為隊頭。

當隊列中沒有元素時,被稱為空隊列。

同理當插入元素已經(jīng)充滿隊列,被稱為滿隊列.

Queue隊列

Queue隊列的源碼解析

Queue的插入操作

/**
 * 相同點:
 * 插入為null的元素,會報空指針
 * 插入與執(zhí)行泛型不符的類型會報類型轉換異常
 * 插入某些不允許插入的元素,會阻止其插入,IDE會提示非法參數(shù)
 * 
 * 不同點:
 * 在滿隊列狀態(tài)下:
 * 使用add()方法會報IllegalStateException異常,提示隊列已滿.
 * 使用offer()方法在此情況下不會報異常而返回false.
 */
    boolean add(E e);
    boolean offer(E e);

上述兩種方法都是插入操作,當插入元素成功時,會返回true.
不同點:

注意 : 隊列中不允許插入為null的元素,否則會報空指針.

在進行插入操作時,一般情況推薦使用offer()來插入元素.


Queue的取出操作

/**
 * 相同點:
 * 都是Queue的取出操作,返回值為隊列容器頭部元素.
 * 
 * 不同點:
 * 當處于空隊列狀態(tài)時,remove()方法會拋出隊列為空,沒有匹配元素的的異常
 * 而poll()方法則會返回null值,不會報異常.
 */
E remove();
E poll();

在進行刪除操作時,一般情況推薦使用poll()來取出元素


Queue的檢索操作

/**
 * 相同點:
 * 都是Queue的檢索操作,返回值為隊列容器頭部元素,但是不會刪除元素.
 * 
 * 不同點:
 * 當處于空隊列狀態(tài)時,element()方法會拋出隊列為空,沒有匹配元素的的異常
 * 而peek()方法則會返回null值,不會報異常.
 */
E element();
E peek();

在進行檢索操作時,一般情況推薦使用peek()來取出元素


下圖將隊列(Queue)的操作進行了總結 :


隊列的操作總結圖

Deque(雙端隊列)的介紹

Deque的含義是“double ended queue”,即雙端隊列.

Deque是一種具有隊列和棧的性質的數(shù)據(jù)結構.雙端隊列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行.

通過開始的類圖可以發(fā)現(xiàn),Deque繼承了Queue(隊列)的接口,它的直接實現(xiàn)有ArrayDeque、LinkedList等。

Deque的容量有兩種模式,一種是固定長度,另一種是容量無限。

同Queue一樣,Deque也定義了兩套操作訪問元素的方法,比如在頭部和尾部進行插入、刪除、檢索元素、同樣的,一種是在滿隊列或者空隊列的操作元素時,會報異常,而另一種則會return null或者return false。

<font color="red">這里引用了博主“瘋子123”的博文,對于Deque介紹的示意圖</font>

Java 集合深入理解(10):Deque 雙端隊列

由于Deque接口繼承Queue接口,當Deque當做隊列使用時(FIFO),只需要在頭部刪除,尾部添加即可。

Deque繼承了Queue的接口

除此之外,Deque也可以當做棧(后進先出)使用,這時入棧,出棧的元素都在雙端隊列的頭部進行。

Deque被當做Stack使用

看圖在結合Queue的分析,大家就會明白Deque方法的含義。


Deque的實現(xiàn)類

Deque的使用場景

在一般情況,不涉及到并發(fā)的情況下,有兩個實現(xiàn)類,可根據(jù)其自身的特性進行選擇,分別是:

LinkedList 大小可變的鏈表雙端隊列,允許元素為 null
ArrayDeque 大下可變的數(shù)組雙端隊列,不允許 null

注意:LinkedList 和ArrayDeque是線程不安全的容器。

在并發(fā)場景下,推薦使用LinkedBlockingDeque:

LinkedBlockingDeque(阻塞的雙向隊列)

因為LinkedBlockingDeque在隊列為空的情況下,獲取操作將會阻塞,直到有元素添加。


關于ArrayDeque、LinkedList

因為網(wǎng)上對于ArrayDeque已經(jīng)有詳細的介紹,這里就不打算在進行重復的去翻譯API,直接附上鏈接。

這里推薦的是博主czj4451的源碼分析:

內(nèi)含LinkedList和ArrayDeque。


參考文章:

1.Java 集合深入理解(10):Deque 雙端隊列
http://www.cnblogs.com/hehehaha/p/6147206.html

2.同步容器、并發(fā)容器、阻塞隊列、雙端隊列與工作密取
http://www.tuicool.com/articles/jE3IV3

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

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

  • hashmap實現(xiàn)的數(shù)據(jù)結構,數(shù)組、桶等。 如圖所示 JDK 1.7,是以數(shù)組+鏈表組成的,鏈表為相同hash的鍵...
    不需要任何閱讀 933評論 0 1
  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表,這種線性表只能在固定一端(通常認為是線性表的尾端)進行插入,...
    Jack921閱讀 1,623評論 0 5
  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結構如棧,隊列等,Java集合還可以用于保存具有映射關...
    小徐andorid閱讀 2,079評論 0 13
  • 說來也奇怪,我是一個鄉(xiāng)下丫頭,學習外語也是初中才開始的事了,但是我就是能學得好,你肯定不知道為什么我學得好,只有我...
    自我陛下閱讀 211評論 0 0
  • 參考:http://www.itdecent.cn/p/e9c1525cc540 記錄一下Xcode9的新特性。
    不離閱讀 164評論 0 0

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