優先隊列有兩種:最大優先隊列,當前最大的元素優先出隊;最小優先隊列,當前最小的元素優先出隊。api
PriorityQueue
經過用數組表示的小頂堆來實現,具體結構以下圖所示數組
首先任何結點都小於其左右子結點,除此以外,對於任何一個結點,假設它的下標爲n:函數
成員變量spa
構造函數code
看起來有7種實際上只有4種隊列
除了第一種,其它的是對PriorityQueue
、SortedSet
和其它Collection
進行初始化,其中SortedSet
自己就已是排好序,因此不須要通過什麼特殊處理,而其它的則須要調用heapify()
進行處理。rem
進入heapify()
源碼能夠看到用到了siftDown()
函數,後面會講到源碼
add
和offer
的語義是相同的,add
也是調用了offer
,主要的是擴容函數grow
和篩選函數siftUp
。擴容函數後面講,先來分析篩選函數(siftUp/siftDown)。it
假設待插入的元素是4,這個gif圖有個缺陷就是,比較完後,並非4和待比較的結點交換,而是單純把父節點移下來。io
siftDown
和siftUp
差很少,都是包含有比較器和沒有比較器兩種方法,這裏就拿一個分析便可。
因爲查詢並無涉及結構的變化和調整,因此源碼是很是簡單的。
擴容發生在添加元素的時候,當size >= queue.length
的時候就會發生擴容。