PriorityQueue原始碼分析

2021-09-29 02:37:32 字數 916 閱讀 4417

優先佇列

內部實現是是堆,結構是陣列,使用堆排序

初始化容量11,如果插入數的時候,大於當前佇列陣列容量,則擴容

擴容方案:如果當前陣列小於64,則擴容一倍,如果大於,則擴容50%, 這用arrays.copyof將原有陣列放到另一塊新的空間

內部實現堆排序主要靠三個函式(private):

堆排序,父節點:i,兩個兒子節點:2i+1、2i+2

最大堆為例(可以comparator來自定義優先順序):

siftup(k,e):k插入位置,e插入的元素,將e從當前位置k不斷上浮(與父節點比較,如果大於父節點,父子交換,繼續上浮),找到e元素應該的位置

siftdown(k,e):k插入位置,e插入的元素,將e從當前位置k不斷下浮(與當前節點左右子節點比較,如果小於左or右子節點,父子交換,繼續下沉),找到e元素應該的位置

heapify(): 初始化堆,從非葉子結點進行下沉siftdown調整,最終結果最大元素在堆頂。相當於堆排序的第一步。

可見:priorityqueue佇列並非所有元素有序,只是保證第乙個元素優先順序最高。

核心函式(public):

offer(e e),佇列中插入e元素:1. 是否需要擴容;2. 將e元素插入隊尾,上浮siftup(size, e)

remove(e e), 佇列中刪除e元素:

1)找到e元素在佇列中的index(直接遍歷陣列找就行),

2) 如果index==size-1,index位置直接為null即可;

3) 將末尾的元素放到index位置,下浮siftdown(index, e),如果沒有下浮,則上浮,如果上浮成功,則返回最末尾元素(因為如果是遍歷,因為最末尾元素上浮,無法訪問到該元素,要把該元素返回供訪問)其他情況返回null(因為下浮或者在index位置,都可以訪問到該元素,所以直接返回null即可)

參考:

Java8 PriorityQueue 原始碼解析

前世今生 extends abstractqueue abstractqueue extends abstractcollection implements queue 實現原理大白話 內部使用你所熟悉的資料結構最堆來實現,每次都是取堆頂的元素。至於堆怎麼實現,其實很簡單,就乙個陣列而已,這裡就不討...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...