1. 程式人生 > >Java優先佇列PriorityQueue的各種開啟方式以及一些你不知道的細節

Java優先佇列PriorityQueue的各種開啟方式以及一些你不知道的細節

[TOC] ## Java優先佇列PriorityQueue的各種開啟方式以及一些你不知道的細節 > 未經作者允許,不可轉載,如有錯誤,歡迎指正o(* ̄▽ ̄*)o - 首先我們知道用PriorityQueue這個類建立的物件是一個集合,然後呼叫api可以將一個個物件新增入集合,然後再通過api遍歷時,插入的元素就從小到大排序輸出,真的太神奇了! - 下面將介紹優先佇列的預設用法以及我想自己寫個類,然後扔到優先佇列中讓它也能從小到大排序怎麼做?從大到小嘞?又或者我又想用系統的類比如String,但是我想按字典序從大到小能做嗎? - **題外話:每插入一個就會自動排序,這麼強大的功能,效率一定不高吧?但如果你學過資料結構,想一下建堆的過程,以及堆排序中新增與調整堆的過程你就會發現,堆排序與優先佇列每次插入排序的功能是那麼契合~** - 下面的講解我嘗試用一種循序漸進的方式講述我知道的優先佇列,有經驗的讀者可能會覺得很囉嗦,但我還是覺得這能幫助你梳理一下知識點 ### 優先佇列的預設用法—從小到大排序 我們先新建一個優先佇列,然後扔四個字元進去,然後用迭代器Iterator或者for-each方式遍歷列印,或者直接用println()列印,結果並非從小到大,而是(層序遍歷的堆,總之不是你要的~),事實上只有通過優先佇列定義的api才能按從小到大取出元素,比如remove方法 此時如果你對: 1. **為什麼能用for each形式可以列印集合有疑惑**:這就要追根溯源到這個PriorityQueue類的來源,Java集合框架是一個大家族,它們由很多的介面定義了不同的功能,再由很多抽象類去逐步實現這些介面的功能,抽象類一代代繼承,最後得到如優先佇列這樣的最終實現類,而for each的遍歷方式是它的最上面的祖先Iterable介面中的一個方法,任何實現了Iterable介面的類都能用迭代器進行遍歷 2. **為什麼能System.out.println(XX);直接列印一個XX物件有疑惑**:事實上只有實現了toString方法的類,才能在呼叫這個方法的時候轉化成字串再列印 回到我們的程式 ```java public class PriorityQueueTest { public static void main(String[] args) { //這裡String型別預設實現Comparable介面的 就是按字典序排序 從小大到 //上面這個註釋你可能不太明白,看下去就會明白了~,現在無視它 var pq = new Prior