PriorityQueue(優先隊列)
實際上是一個堆(不指定Comparator時默認為最小堆)
隊列既可以根據元素的自然順序來排序,也可以根據 Comparator來設置排序規則。
隊列的頭是按指定排序方式的最小元素。如果多個元素都是最小值,則頭是其中一個元素。
新建對象的時候可以指定一個初始容量,其容量會自動增加。
注意1:該隊列是用數組實現,但是數組大小可以動態增加,容量無限。
注意2:隊列的實現不是同步的。不是線程安全的。如果多個線程中的任意線程從結構上修改了列表, 則這些線程不應同時訪問 PriorityQueue實例。保證線程安全可以使用PriorityBlockingQueue 類。
注意3:不允許使用 null 元素。
注意4:插入方法(offer()、poll()、remove() 、add() 方法)時間復雜度為O(log(n)) ;
remove(Object) 和 contains(Object) 時間復雜度為O(n);
檢索方法(peek、element 和 size)時間復雜度為常量。
注意5:方法iterator()中提供的迭代器並不保證以有序的方式遍歷優先級隊列中的元素。(原因可參考PriorityQueue的內部實現)
如果需要按順序遍歷,可用Arrays.sort(pq.toArray())。
注意6:可以在構造函數中指定如何排序。如:
PriorityQueue()
使用默認的初始容量(11)創建一個 PriorityQueue,並根據其自然順序來排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity)
使用指定的初始容量創建一個 PriorityQueue,並根據其自然順序來排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
使用指定的初始容量創建一個 PriorityQueue,並根據指定的比較器comparator來排序其元素。
注意7:此類及其迭代器實現了 Collection 和 Iterator 接口的所有可選 方法。
PriorityQueue對元素采用的是堆排序,頭是按指定排序方式的最小元素。堆排序只能保證根是最大(最小),整個堆並不是有序的。
方法iterator()中提供的迭代器可能只是對整個數組的依次遍歷。也就只能保證數組的第一個元素是最小的。
示例:自己指定比較器進行排序
Queue<Integer> pq = new PriorityQueue<Integer>(11, new Comparator<Integer>() { public int compare(Integer i1, Integer i2) { return i2 - i1; } });
完整例子:
public class PriorityQueueTest{ public static void main(String args[]){ PriorityQueue<People> queue = new PriorityQueue<People>(11, new Comparator<People>() { public int compare(People p1, People p2) { return p2.age - p1.age; } }); for (int i = 1; i <= 10; i++) { queue.add(new People("張"+ i, (new Random().nextInt(100)))); } while (!queue.isEmpty()) { System.out.println(queue.poll().toString()); } } } class People { String name; int age; public People(String name, int age){ this.name = name; this.age = age; } public String toString() { return "姓名:"+name + " 年齡:" + age; } }