優先佇列
內部實現是是堆,結構是陣列,使用堆排序
初始化容量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...