Deque
interface Deque <E>
子接口:
BlockingDeque <E>
實(shí)現(xiàn)類(lèi):
線性集合挺庞,支持兩端的元素插入和移除。Deque是double ended queue
的簡(jiǎn)稱(chēng)巫湘,習(xí)慣上稱(chēng)之為雙端隊(duì)列。大多數(shù)Deque 實(shí)現(xiàn)對(duì)它們可能包含的元素的數(shù)量沒(méi)有固定的限制,但是該接口支持容量限制的deques以及沒(méi)有固定大小限制的deque。
在大多數(shù)實(shí)現(xiàn)中内贮,插入操作不會(huì)失敗。
發(fā)音為deck
,千萬(wàn)因?yàn)榘l(fā)音問(wèn)題出丑哦汞斧。
Deque同時(shí)擴(kuò)展了Queue接口夜郁,當(dāng)Deque作為隊(duì)列的時(shí)候,會(huì)產(chǎn)生FIFO(先進(jìn)先出)行為断箫。元素添加在雙端隊(duì)列的末尾并從頭開(kāi)始刪除拂酣。
Queue 方法 | 等效Deque方法 |
---|---|
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
同時(shí)秋冰,Deque也可以作為L(zhǎng)IFO(后進(jìn)先出)堆棧,此接口優(yōu)于傳統(tǒng)的Stack類(lèi)使用仲义。
Stack和Deque方法的比較
棧方法 | 等效Deque方法 |
---|---|
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
與List接口不同,此接口不支持索引訪問(wèn)元素。
這個(gè)接口提供了兩種方法去除內(nèi)部元素埃撵,removeFirstOccurrence和removeLastOccurrence赵颅。
removeFirstOccurrence(Object o) | removeLastOccurrence(Object o) |
---|---|
從此雙端隊(duì)列中移除指定元素的第一個(gè)匹配項(xiàng)。 | 從此雙端隊(duì)列中移除指定元素的最后一次出現(xiàn)暂刘。 |
雖然 Deque 實(shí)現(xiàn)沒(méi)有嚴(yán)格要求禁止插入 null 元素饺谬,但建議最好這樣做。建議任何事實(shí)上允許 null 元素的 Deque 實(shí)現(xiàn)用戶(hù)最好不 要利用插入 null 的功能谣拣。這是因?yàn)楦鞣N方法會(huì)將null 用作特殊的返回值來(lái)指示雙端隊(duì)列為空募寨。
Deque 實(shí)現(xiàn)通常不定義基于元素的 equals 和 hashCode 方法,而是從 Object 類(lèi)繼承基于身份的equals 和 hashCode 方法森缠。
Deque的使用場(chǎng)景
在一般情況拔鹰,不涉及到并發(fā)的情況下,有兩個(gè)實(shí)現(xiàn)類(lèi)贵涵,可根據(jù)其自身的特性進(jìn)行選擇列肢,分別是:
- LinkedList 大小可變的鏈表雙端隊(duì)列,允許元素為插入null宾茂。
- ArrayDeque 大下可變的數(shù)組雙端隊(duì)列瓷马,不允許插入null。
- ConcurrentLinkedDeque 大小可變且線程安全的鏈表雙端隊(duì)列跨晴,非阻塞欧聘,不允許插入null。
- LinkedBlockingDeque 為線程安全的雙端隊(duì)列端盆,在隊(duì)列為空的情況下树瞭,獲取操作將會(huì)阻塞,直到有元素添加爱谁。
注意:LinkedList 和 ArrayDeque 是線程不安全的容器晒喷。