天天看點

Java中的PriorityQueue優先級隊列

以前的部落格中介紹過隊列是一種先進先出(FIFO)的資料結構,但有些情況下,操作的資料可能帶有優先級,此時出隊列時需要優先級高的元素先出隊列,這個時候傳統的隊列顯然不能勝任,Java中有一個新的實作類繼承了Queue接口,這個類實作了上述優先級隊列——PriorityQueue。

PriorityQueue是怎麼知道隊列中哪個元素優先哪個元素不優先的呢?Java中的Comparable和Comparator到底該怎麼用看完就全明白了大家可以看一下我這篇文章(不看不影響,看了解的更深刻)有兩個路子:

  1. 隊列中對象的實作類必須實作Comparable接口,重寫了comparaTo()方法,PriorityQueue會根據ComparaTo()的傳回值來找到優先級高的元素并把它放在隊首。
  2. 專門為隊列中元素寫一個實作了Comparator接口的比較器,在建立優先級隊列的時候把比較器對象作為參數傳進去:
    Java中的PriorityQueue優先級隊列

想具體了解Comparable和Comparator還請看上面那篇部落格,這篇部落客要介紹PriorityQueue,總之優先級隊列想要得到優先級高的元素就必須要對隊列中的元素進行比較,可問題比較依據是什麼?這個問題上面兩個路子就給解決了,PriorityQueue會好了,聊到現在PriorityQueue可以選出隊列中優先級高的元素了。

PriorityQueue的常用構造方法:

Java中的PriorityQueue優先級隊列
Java中的PriorityQueue優先級隊列

PriorityQueue常用方法:

Java中的PriorityQueue優先級隊列
Java中的PriorityQueue優先級隊列

下面具體通過Integer(它實作了Comparable,是以有比較能力,PriorityQueue能選出優先級高的元素)示範一下:

public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new PriorityQueue<>();

        //入隊列
        queue.add(1);
        queue.add(999);
        queue.add(45);
        queue.add(3);
        queue.add(66);

        //看看隊首元素
        System.out.println("對首元素" + queue.element());
        //出隊列
        queue.remove();
        //看看對首元素、
        System.out.println("對首元素" + queue.element());
        //檢視隊列是否為空
        System.out.println(queue.isEmpty());
        //輸出目前隊列大小
        System.out.println(queue.size());
    }
}

           

運作結果:

Java中的PriorityQueue優先級隊列

繼續閱讀