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>

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

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

看圖在結合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,直接附上鏈接。
內(nèi)含LinkedList和ArrayDeque。
參考文章:
1.Java 集合深入理解(10):Deque 雙端隊列
http://www.cnblogs.com/hehehaha/p/6147206.html
2.同步容器、并發(fā)容器、阻塞隊列、雙端隊列與工作密取
http://www.tuicool.com/articles/jE3IV3
