面試連環炮之HashMap(下)

2021-10-10 00:22:52 字數 1812 閱讀 8545

相比於之前的版本,jdk1.8在解決雜湊衝突時有了較大的變化,當鍊表長度大於閾值(預設為8)時,並且容量大於64時,將鍊錶轉化為紅黑樹,以減少搜尋時間。

map的初始化並不會構建好結構,而是在put方法時,構建出來,這也就是我們經常說的延遲載入

public

hashmap()

public

hashmap

(int initialcapacity)

public

hashmap

(int initialcapacity,

float loadfactor)

public v put

(k key, v value)

final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

// 判斷鍊錶中結點的key值與插入的元素的key值是否相等

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

// 相等,跳出迴圈

break

;// 用於遍歷桶中的鍊錶,與前面的e = p.next組合,可以遍歷鍊錶

p = e;}}

// 表示在桶中找到key值、hash值與插入元素相等的結點

if(e != null)

}// 結構性修改

++modcount;

// 擴容if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

final node

resize()

elseif(

(newcap = oldcap <<1)

< maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr <<1;

// double threshold

}// 初始化時,也不會進來

else

if(oldthr >

0)

newcap = oldthr;

else

// 初始化時不會進來

if(newthr ==0)

// 閾值有了~~~16

threshold = newthr;

@suppresswarnings()

//初始化了~ 並且容量是16

node

newtab =

(node

)new

node

[newcap]

; table = newtab;

}

訊息佇列 面試連環炮

為什麼使用訊息佇列?訊息佇列都有什麼優缺點?kafka activemq ribbitmq rocketmq都有什麼優缺點?如何保證訊息佇列的高可用?如何保證訊息不被重複消費?如何保證訊息消費時的冪等性?如何保證訊息的可靠性傳輸,要是訊息丟失了怎麼辦?如何保證訊息的順序性?如何解決訊息佇列的延時以及...

面試連環炮系列(二十) TCP的滑動視窗協議是什麼

tcp的滑動視窗協議是什麼 滑動視窗協議,用於網路資料傳輸時的流量控制,以避免擁塞的發生。該協議允許傳送方在停止並等待確認前傳送多個資料分組。由於傳送方不必每發乙個分組就停下來等待確認,因此該協議可以加速資料的傳輸,提高網路吞吐量。它本質上是描述接收方的tco資料報緩衝區大小的資料,傳送方根據這個資...

每日一面系列之HashMap奪命連環問

底層資料結構是雜湊表結構 鍊錶雜湊 陣列 單向鍊錶 結合了陣列和鍊錶的優點,當鍊表長度超過8時,鍊錶會轉為紅黑樹。陣列中的每乙個元素都是鍊錶。總結來說就是hashmap在jdk1.8之前底層是由陣列 鍊錶實現的,在jdk1.8開始底層是由陣列 鍊錶或者陣列 紅黑樹實現的。追問 為什麼在1.8中增加紅...