Queue
隊列的特點是向末尾添加元素,從隊列頭删除元素,隊列中允許有重複元素。
1. 加入元素的方法:
boolean add(E element)//E是泛型類型
boolean offer(E element)
如果添加成功傳回true。如果隊列已滿,add()方法會抛出IllegalStateException,offer()方法傳回false。
2. 删除元素的方法:
E remove()
E poll()
如果隊列為空,remove()方法會抛出NoSuchElementEcxeption,poll()方法傳回null。
3. 擷取元素的方法:
E element()
E peek()
如果隊列為空,element()方法抛出NoSuchElementException,peek()方法傳回null。
Deque
Deque是Queue的子接口,表示雙向隊列。可以在隊頭和隊尾添加或删除元素。
1. 向隊頭或隊尾添加元素的方法:
void addFirst(E element)
void addLast(E element)
boolean offerFirst(E element)
boolean offerLast(E element)
如果隊列已滿,前2個方法會抛出IllegalStateException,後2個方法傳回false。
2. 從隊頭或隊尾删除元素的方法:
E removeFirst()
E removeLast()
E pollFirst()
E pollLast()
如果隊列為空,前2個方法會抛出NoSuchElementEcxeption,後2個方法傳回null。
3. 從隊頭或隊尾擷取元素的方法:
E getFirst()
E getLast()
E peekFirst()
E peekLast()
如果隊列為空,前2個方法會抛出NoSuchElementEcxeption,後2個方法傳回null。
PriorityQueue
PriorityQueue(優先級隊列)會按照排序的方式對隊列中的元素進行排序和檢索。是以加入到PriorityQueue中的對象必須實作Comparable接口,提供對元素排序時的比較規則。
示例:
import java.util.*;
public class Tester {
public static void main(String[] args) {
Queue<Integer> pq = new PriorityQueue<>();
pq.add(13);
pq.add(24);
pq.add(10);
pq.add(30);
System.out.println("周遊隊列:");
for(Integer e:pq) {
System.out.print(" "+e);
}
System.out.println();
System.out.println("依次删除隊列中的元素:");
while(pq.isEmpty()==false) {
System.out.print(" "+pq.remove());
}
}
}
/*
輸出結果:
周遊隊列:
10 24 13 30
依次删除隊列中的元素:
10 13 24 30
*/
通過foreach周遊時,取得的元素并沒有進行排序,而在調用remove()方法時,該方法總會删除目前隊列中最小的元素,是以删除結果是10,13,24,30。
優先級隊列的底層實作原理是通過二叉小頂堆實作的(用一棵完全二叉樹表示[任意一個非葉子節點的權值都不大于其左右子節點的權值]),是以add()方法執行如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB9UNZpWT0smeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxYzN4QDNzIjM5EDMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
先加入13,然後加入24,都滿足定義,當加入10的時候,10<13,是以10和13位置調換,最後加入30,滿足定義。
周遊輸出的時候是采用層次周遊,是以輸出結果為10,24,13,30.