Java8 PriorityQueue 原始碼解析

2021-08-25 08:42:49 字數 1437 閱讀 1704

前世今生

extends abstractqueue

abstractqueue extends abstractcollection implements queue

實現原理大白話

內部使用你所熟悉的資料結構最堆來實現,每次都是取堆頂的元素。至於堆怎麼實現,其實很簡單,就乙個陣列而已,這裡就不討論怎麼實現堆了。預設是根據傳入的物件進行比較建立初始堆的。比如說 string 實現了 comparable 介面,裡面就是根據這個進行排序建立初始堆的。

主要的建構函式

// 可以使用外排序 comparator 來構建你自己的堆,預設為空

// initialcapacity 為初始堆大小,一般來說,為了避免擴容,或者空間浪費,我們要選擇合適的值,預設值為 default_initial_capacity = 11

public

priorityqueue(int initialcapacity, comparator<? super e> comparator)

新增元素
public

boolean

add(e e)

// 呼叫的是offer

public

boolean

offer(e e)

刪除元素
// 同樣使用 siftdown,首先將最後乙個元素移到堆頂,再調整堆即可

public e poll()

獲取堆頂元素
// 直接陣列返回

// 也可以使用 element(),是 abstractqueue 的方法,呼叫的也是 peek() 再一次感受到多型物件的強大

public e peek()

獲取後一位置的元素
// 因為使用的是最堆的資料結構,所以只能遍歷,效率較低

private

intindexof(object o)

return -1;

}

關於siftup
// 如果沒有外排序,則使用內排序

private

void

siftup(int k, e x)

簡單看乙個函式,複習一下堆
private

void

siftupcomparable(int k, e x)

queue[k] = key;

}

你可能遇到的坑

如果你中途改變了資料,有關排序的字段,最小堆是不會自動重新構建,那麼,這個優先順序佇列就會失效!!!!!!舉個例子,你把一堆學生按身高放入優先順序佇列,突然,有幾個學生的身高改變了,這個最小堆是不會重構的,這時候得不到你想要的值,那有沒有重構的函式,抱歉,沒有!heapify 是私有的函式,但是你可以通過 new priorityqueue(queue),重新構建乙個

java物件導向8

object是所有物件的父類,可以接受任何的物件。還有包裝類 基本資料型別int,包裝類integer。主要應用將字串轉換為數字。異常 throwable error 通常出現重大問題如 執行的類不存在或者記憶體溢位等。不編寫針對 對其處理。exception 在執行時執行出現的一起情況,可以通過t...

java8總結(未完)

1.lambda表示式與functional介面 lambda表示式 閉包 允許把函式作為乙個方法的引數 乙個lambda由逗號分隔的引數列表 符號與函式體表示 arrays.aslist a b c foreach e system.out.println e 引數e的型別是由編譯器推測出來的,同...

JAVA 8 多執行緒

方法1實現runnable介面 方法2實現thread介面 public class createthread implements runnable 匿名類 沒有建構函式 class a public static void main string args a c new k k是抽象的介面,呼...