相比於之前的版本,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中增加紅...