前世今生
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是抽象的介面,呼...