一、Queue和Deque
Queue以及Deque都是繼承于Collection,Deque是Queue的子介面,
Queue是FIFO的單向佇列,Deque是雙向佇列,
Queue有一個直接子類PriorityQueue,而Deque中直接子類有兩個:LinkedList以及ArrayDeque,
PriorityQueue的底層資料結構是陣列,而無邊界的形容,那么指明了PriorityQueue是自帶擴容機制的,
ArrayDeque是無初始容量的雙端佇列,LinkedList則是雙向鏈表,
PriorityQueue可以作為堆使用,而且可以根據傳入的Comparator實作大小的調整,會是一個很好的選擇,
ArrayDeque通常作為堆疊或佇列使用,但是堆疊的效率不如LinkedList高,
LinkedList通常作為堆疊或佇列使用,但是佇列的效率不如ArrayQueue高,
二、api對比
| Queue | Deque | |
| 增加 | add | add、addFirst、addLast |
| offer | offer、offerFirst、offerLast | |
| 移除 | remove | remove、removeFirst、removeLast |
| poll | pop、poll、pollFirst、pollLast | |
| 獲取 | element | element、getFirst、getLast |
| peek | peek、peekFirst、peekLast |
備注:
1、add和offer區別
- add() : 添加元素,如果添加成功則回傳true,如果佇列是滿的,則拋出例外
- offer() : 添加元素,如果添加成功則回傳true,如果佇列是滿的,則回傳false
2、remove和poll
- remove() : 移除佇列頭的元素并且回傳,如果佇列為空則拋出例外
- poll() : 移除佇列頭的元素并且回傳,如果佇列為空則回傳null
Deque新增了一個pop方法,也是移除佇列頭的元素并且回傳,如果佇列為空則拋出例外,
3、element和peek
- element() :回傳佇列頭元素但不移除,如果佇列為空,則拋出例外
- peek() :回傳佇列頭元素但不移除,如果佇列為空,則回傳null
因此,增加推薦使用add,移除推薦使用poll,獲取元素推薦使用peek,
三、代碼實體
1、queue
public static void test01(){
Queue<String> queue = new LinkedList<>();
// add()和remove()方法在失敗的時候會拋出例外(不推薦)
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
queue.add("f");
//在佇列元素為空的情況下,remove() 方法會拋出NoSuchElementException例外,poll() 方法只會回傳 null ,
String first2 = queue.remove();//回傳第一個元素,洗掉
System.out.println(first2);//a
String first1 = queue.poll();//回傳第一個元素,洗掉
System.out.println(first1);//b
String first = queue.peek();//回傳第一個元素,但不洗掉
System.out.println(first);//c
System.out.println(queue);//[c, d, e, f]
first = queue.element();//回傳第一個元素
System.out.println(first);//c
}
2、deque
public static void test02(){
Deque<String> deque = new LinkedList<>();
deque.offer("a");
deque.offer("b");
deque.offerFirst("c");//在佇列頭部進行插入
System.out.println(deque);//[c, a, b]
deque.offerLast("d");
System.out.println(deque);//[c, a, b, d]
String ret = deque.element();//回傳第一個元素
System.out.println(ret);//c
ret = deque.getFirst();//回傳第一個元素
System.out.println(ret);//c
ret = deque.getLast();//回傳最后一個元素
System.out.println(ret);//d
ret = deque.peek();//回傳第一個元素,但不洗掉
System.out.println(ret);//c
ret = deque.peekFirst();//回傳第一個元素,但不洗掉
System.out.println(ret);//c
ret = deque.peekLast();//回傳最后一個元素,但不洗掉
System.out.println(ret);//d
System.out.println(deque);
ret = deque.poll();//回傳第一個元素,洗掉
System.out.println(ret);//c
System.out.println(deque);//[a, b, d]
ret = deque.pop();//回傳第一個元素,洗掉
System.out.println(ret);//a
System.out.println(deque);//[b, d]
deque.clear();
ret = deque.pop();//拋例外
System.out.println("11111");
ret = deque.poll();//回傳null,但不拋例外
System.out.println("++"+ret);
System.out.println("22222");
}
往期精彩內容:
Java知識體系總結
【全堆疊最全Java框架總結】SSH、SSM、Springboot
超詳細的springBoot學習筆記
常見資料結構與演算法整理總結
Java設計模式:23種設計模式全面決議
Java面試題總結(附答案)
10萬字208道Java經典面試題總結(附答案,建議收藏)
MySql知識體系總結
Linux知識體系總結
【Vue基礎知識總結 1】Vue入門
Redis知識體系總結
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294810.html
標籤:其他
上一篇:【Linux配置環境白嫖】Centos 7虛擬機環境安裝保姆級服務
下一篇:Docker學習筆記
