Deque
interface Deque <E>
子接口:
BlockingDeque <E>
實(shí)現(xiàn)類:

線性集合,支持兩端的元素插入和移除。Deque是double ended queue的簡稱,習(xí)慣上稱之為雙端隊列。大多數(shù)Deque 實(shí)現(xiàn)對它們可能包含的元素的數(shù)量沒有固定的限制,但是該接口支持容量限制的deques以及沒有固定大小限制的deque。
在大多數(shù)實(shí)現(xiàn)中,插入操作不會失敗。
發(fā)音為deck,千萬因?yàn)榘l(fā)音問題出丑哦。

Deque同時擴(kuò)展了Queue接口,當(dāng)Deque作為隊列的時候,會產(chǎn)生FIFO(先進(jìn)先出)行為。元素添加在雙端隊列的末尾并從頭開始刪除。
| Queue 方法 | 等效Deque方法 |
|---|---|
| add(e) | addLast(e) |
| offer(e) | offerLast(e) |
| remove() | removeFirst() |
| poll() | pollFirst() |
| element() | getFirst() |
| peek() | peekFirst() |
同時,Deque也可以作為LIFO(后進(jìn)先出)堆棧,此接口優(yōu)于傳統(tǒng)的Stack類使用。
Stack和Deque方法的比較
| 棧方法 | 等效Deque方法 |
|---|---|
| push(e) | addFirst(e) |
| pop() | removeFirst() |
| peek() | peekFirst() |
與List接口不同,此接口不支持索引訪問元素。
這個接口提供了兩種方法去除內(nèi)部元素,removeFirstOccurrence和removeLastOccurrence。
| removeFirstOccurrence(Object o) | removeLastOccurrence(Object o) |
|---|---|
| 從此雙端隊列中移除指定元素的第一個匹配項(xiàng)。 | 從此雙端隊列中移除指定元素的最后一次出現(xiàn)。 |
雖然 Deque 實(shí)現(xiàn)沒有嚴(yán)格要求禁止插入 null 元素,但建議最好這樣做。建議任何事實(shí)上允許 null 元素的 Deque 實(shí)現(xiàn)用戶最好不 要利用插入 null 的功能。這是因?yàn)楦鞣N方法會將null 用作特殊的返回值來指示雙端隊列為空。
Deque 實(shí)現(xiàn)通常不定義基于元素的 equals 和 hashCode 方法,而是從 Object 類繼承基于身份的equals 和 hashCode 方法。
Deque的使用場景
在一般情況,不涉及到并發(fā)的情況下,有兩個實(shí)現(xiàn)類,可根據(jù)其自身的特性進(jìn)行選擇,分別是:
- LinkedList 大小可變的鏈表雙端隊列,允許元素為插入null。
- ArrayDeque 大下可變的數(shù)組雙端隊列,不允許插入null。
- ConcurrentLinkedDeque 大小可變且線程安全的鏈表雙端隊列,非阻塞,不允許插入null。
- LinkedBlockingDeque 為線程安全的雙端隊列,在隊列為空的情況下,獲取操作將會阻塞,直到有元素添加。
注意:LinkedList 和 ArrayDeque 是線程不安全的容器。