PriorityQueue 是構建在無界優先級隊列和優先級堆上的重要 Java API 之一,本文介紹了有關此 API的一些復雜信息。想要學習java的同學可以報名參加java培訓,可以獲得快速有效的學習,全面掌握java的使用。
概述
PriorityQueue 類是 java.util 包的一部分,是 Java 中基于優先級的隊列的通用實現。隊列基本上是一種數據結構,它定義了從商店中插入和檢索項目的過程的特定規范。這個想法與許多人排隊等候買票非常相似。第一個站在隊列中的人有第一個機會獲得門票,最后一個人有機會在最后獲得一個機會。人們被添加到隊列的末尾或尾部。向隊列中添加項在技術上稱為入隊過程,從隊列中刪除的項是從行中的第一個開始的。這稱為出隊。這個想法是以 FIFO(先進先出)的方式對元素進行排序。
現在,這是最簡單的架構,并且嚴格定義了隊列的實際含義以及如何在計算機中對其進行模擬。存儲通常由一個簡單的數組表示,其中存儲和檢索過程具有此定義的規范。優先級隊列在此之上施加了一些特殊規范。
隊列的Java實現
Java API 在 java.util 包中有一個通用接口名稱 Queue<E>。這是 Java 集合框架 API 的一部分,旨在在處理之前保存元素。作為 Collection 的一部分,它具有所有基本的 Collection 操作。特定于其身份的操作處理存儲在其中的元素的插入、提取和檢查。這些操作中的每一個都有兩種不同的形式,例如,一種在操作失敗時拋出異常,另一種根據操作返回特殊值,例如 null 或 false。請注意,與典型隊列不同,Java 隊列的具體實現不一定以 FIFO 方式對元素進行排序。對于基于優先級的隊列尤其如此,其中元素的排序是根據提供的比較器或自然排序完成的。但無論排序如何,remove() 或 poll() 方法總是會檢索隊列頭部的元素。這兩種不太可能的方法之間的具體區別似乎是一種相似的方法,一種在失敗時拋出異常(NoSuchElementException),而后者則返回(null),一個特殊的值。在java培訓中,理論課程結合實戰項目訓練,將知識運化應用,快速提升自己。
請注意,Queue<E> 接口不適合在并發編程中使用,因為它沒有定義阻塞隊列方法,在這些方法中,入隊和出隊進程等待元素出現在隊列中或大小可用,就此而言。有一個特定的接口,稱為 BlockingQueue<E>,它擴展了 Queue<E> 接口并解決了這些問題。
有一個抽象類,稱為 AbstractQueue<E>,它提供了一些隊列操作的部分實現。PriorityQueue<E> 類是這個抽象類的直接擴展。
優先隊列
優先級隊列的 Java 實現是一種特殊類型的隊列,其中元素的排序由其自然排序原則確定或根據創建期間提供的 Comparator 進行定制。我們在構造過程中調用的構造函數決定了與優先隊列一起使用的排序原則。與不允許空元素的 Queue<E> 不同,但某些實現(例如 LinkedList)也不禁止插入空元素。然而,PriorityQueue<E> 根本不允許空元素。如果優先級隊列是按照自然順序構造的,那么任何不可比較的元素插入都會拋出 ClassCastException。
它被聲明為無界的并且基于優先級堆。盡管隊列的大小被稱為無界,但有一個內部容量來確定數組的大小。隨著元素的插入,這個大小會自動增長。但是,沒有詳細說明增大尺寸的原理。
有七種類型的重載構造函數,我們可以通過它們設置參數來指定隊列的初始容量,提供 Comparator 來指定元素的自定義順序,或者使用無參數構造函數接受所有內容作為默認值。對Java 感興趣的同學可以報名參加java培訓,有經驗豐富的專業講師指導教學,可以讓你快速掌握這門技術,節約時間,少走彎路。
PriorityQueue()
PriorityQueue(int initialCapacity)
PriorityQueue(int initialCapacity, Comparator<? Super E> comparator)
PriorityQueue(Commection<? extends E> c)
PriorityQueue(Comparator<? Super E> comparator)
PriorityQueue(PriorityQueue<? extends E> c)
PriorityQueue(SortedSet<? extends E> c)
與 Queue<E> 類似,PriorityQueue<E> 也不是同步的,因此在并發編程中應謹慎使用。但是,有一個同步的替代方案,稱為 PriorityBlockingQueue。這與 PriorityQueue<E> 的工作方式相同,只是具有線程安全的附加條件。
PriorityQueue<E> 中定義的操作與 Queue<E> 相同,只是添加了一些內容。
結論
優先級隊列的附加規范是從列表中刪除的項目具有最高優先級。Java 將優先級規則強加到其他正常隊列的方式是附加元素的排序原則。此順序可以根據程序員的要求進行定制,也可以設置為默認值。這就是 Java 中優先級隊列實現的本質。想學習java更多技能,建議參加java培訓,課程實時更新,緊跟市場和企業,讓你學到最新的java技能,提高市場競爭力。