美人如斯,文章如斯!
定義
雙向隊列:支持插入刪除元素的線性集合
特性:
- 插入、刪除、獲取操作支持兩種形式:快速失敗和返回null或true/false
- 既具有FIFO特點又具有LIFO特點,即是隊列又是棧
- 不推薦插入null元素,null作為特定返回值表示隊列為空
- 未定義基於元素相等的equals和hashCode
UML類圖

Deque繼承關系

接口操作
接口分析
雙向隊列操作
插入元素
-
addFirst(): 向隊頭插入元素,如果元素為空,則發生NPE
-
addLast(): 向隊尾插入元素,如果為空,則發生NPE
-
offerFirst(): 向隊頭插入元素,如果插入成功返回true,否則返回false
-
offerLast(): 向隊尾插入元素,如果插入成功返回true,否則返回false
移除元素
-
removeFirst(): 返回並移除隊頭元素,如果該元素是null,則發生NoSuchElementException
-
removeLast(): 返回並移除隊尾元素,如果該元素是null,則發生NoSuchElementException
-
pollFirst(): 返回並移除隊頭元素,如果隊列無元素,則返回null
-
pollLast(): 返回並移除隊尾元素,如果隊列無元素,則返回null
獲取元素
-
getFirst(): 獲取隊頭元素但不移除,如果隊列無元素,則發生NoSuchElementException
-
getLast(): 獲取隊尾元素但不移除,如果隊列無元素,則發生NoSuchElementException
-
peekFirst(): 獲取隊頭元素但不移除,如果隊列無元素,則返回null
-
peekLast(): 獲取隊尾元素但不移除,如果隊列無元素,則返回null
棧操作
pop(): 彈出棧中元素,也就是返回並移除隊頭元素,等價於removeFirst()
,如果隊列無元素,則發生NoSuchElementException
push(): 向棧中壓入元素,也就是向隊頭增加元素,等價於addFirst()
,如果元素為null,則發生NPE,如果棧空間受到限制,則發生IllegalStateException
應用場景
- 滿足FIFO場景時
- 滿足LIFO場景時,曾經在解析XML按標簽時使用過棧這種數據結構,但是卻選擇
Stack
類,如果在進行棧選型時,更推薦使用Deque
類,應為Stack
是線程同步
主要實現
- ArrayDeque: 基於數組實現的線性雙向隊列
- LinkedList: 基於鏈表實現的鏈式雙向隊列