原本想先看看DelayQueue,結果裏面用到了PriorityQueue,因此先學習一下PriorityQueue的編碼邏輯。html
基於優先級堆的無界優先級隊列。優先級隊列的元素根據其天然順序排序,或者由隊列構造時提供的比較器排序,具體取決於使用的構造函數。優先級隊列不容許null元素。依賴於天然排序的優先級隊列也不容許插入不可比較的對象(這樣作可能致使ClassCastException)。java
此隊列的頭部是指定排序的最小元素。若是多個元素被綁定爲最小值,則頭部是這些元素之一。api
PriorityQueue是無限制的,但具備內部容量,用於控制用於存儲隊列中元素的數組的大小。它始終至少與隊列大小同樣大。當元素添加到優先級隊列時,其容量會自動增長。數組
PriorityQueue不是線程安全的,因此多線程操做的時候要注意一下。安全
咱們能夠看到PriorityQueue的構造方法比較多,咱們看一下比較有特色的,下面是賦值一個initialCapacity和比較器comparator的,若是沒有初始化,那麼會使用默認值DEFAULT_INITIAL_CAPACITY = 11多線程
還有對於集合的構造函數,這裏對SortedSet和PriorityQueue特殊處理了一下,獲取comparator,可是仍是有PriorityQueue(PriorityQueue<? extends E> c)和PriorityQueue(SortedSet<? extends E> c)兩個構造函數,對於其餘集合,是不會設置comparator。最終你們的歸宿都是調用initElementsFromCollection,initFromPriorityQueue和initFromCollection。oracle
以上三個方法都是賦值this.queue和this.size,而後調用heapify構建堆,其中 >>> 是無符號右移,而後操做siftDown操做。函數
這個操做會根據有沒有comparator,執行siftDownUsingComparator或者siftDownComparable。學習
等我梳理一些這個集合操做後,再慢慢看看這些構建的操做。this
peek()操做獲取堆的頭部信息
offer(E e):將指定的元素插入此隊列,會先判斷入參是否爲null,而後判斷數組大小是否足夠,不然執行grow(int minCapacity)擴容,除非是第一個元素,不然會執行入堆的操做!
poll():檢索並刪除此隊列的頭部,若是此隊列爲空,則返回null。而後執行siftDown操做。
remove(Object o):今後隊列中刪除指定元素的單個實例(若是存在)。
此次看的有點粗糙,咱們後續再補充!
下節再續!
參考:https://docs.oracle.com/javase/9/docs/api/java/util/PriorityQueue.html
有什麼討論的內容,能夠加我公衆號: