dk 1.8對hashmap進行了比較大的優化,底層實現由之前的「陣列+鍊錶」改為「陣列+鍊錶+紅黑樹」,本文就hashmap的幾個常用的重要方法和jdk 1.8之前的死迴圈問題展開學習討論。jdk 1.8的hashmap的資料結構如下圖所示,當鍊表節點較少時仍然是以鍊錶存在,當鍊表節點較多時(大於8)會轉為紅黑樹。
先了解以下幾個點,有利於更好的理解hashmap的原始碼和閱讀本文。
頭節點指的是table表上索引位置的節點,也就是鍊錶的頭節點。
根結點(root節點)指的是紅黑樹最上面的那個節點,也就是沒有父節點的節點。
紅黑樹的根結點不一定是索引位置的頭結點。
轉為紅黑樹節點後,鍊錶的結構還存在,通過next屬性維持,紅黑樹節點在進行操作時都會維護鍊錶的結構,並不是轉為紅黑樹節點,鍊錶結構就不存在了。
在紅黑樹上,葉子節點也可能有next節點,因為紅黑樹的結構跟鍊錶的結構是互不影響的,不會因為是葉子節點就說該節點已經沒有next節點。
原始碼中一些變數定義:如果定義了乙個節點p,則pl為p的左節點,pr為p的右節點,pp為p的父節點,ph為p的hash值,pk為p的key值,kc為key的類等等。原始碼中很喜歡在if/for等語句中進行賦值並判斷,請注意。
鍊錶中移除乙個節點只需如下圖操作,其他操作同理。紅黑樹在維護鍊錶結構時,移除乙個節點只需如下圖操作(紅黑樹中增加了乙個prev屬性),其他操作同理。注:此處只是紅黑樹維護鍊錶結構的操作,紅黑樹還需要單獨進行紅黑樹的移除或者其他操作。
路不一定是死的
前段時間給樓下座報表開發,asp.net2.0,客戶有乙個需求,就是報表中要求有 pdf格式的。起初,我有 gridview 匯出到word 或者excel 的資料,所以實現起來很容易,而匯出成 pdf,就犯難了,因為 pdf不是微軟自己的技術,所以在 net2.0 下是不可能有這樣現成的介面了。後...
路不一定是死的
前段時間給樓下座報表開發,asp.net2.0,客戶有乙個需求,就是報表中要求有 pdf格式的。起初,我有 gridview 匯出到word 或者excel 的資料,所以實現起來很容易,而匯出成 pdf,就犯難了,因為 pdf不是微軟自己的技術,所以在 net2.0 下是不可能有這樣現成的介面了。後...
會抓老鼠的貓不一定是好貓
好貓一定會抓老鼠,但是會抓老鼠的貓不一定是好貓。捉老鼠,本來是貓的天職,是主人賦予貓的責任。如果貓捉住老鼠之後,恃功而嬌,在主人還吃不飽飯的時候,天天要主人給買湯姆牌高階貓糧,不給買就罷工不捉老鼠了,這就不是好貓。小時候我鄰居張大.好貓一定會抓老鼠,但是會抓老鼠的貓不一定是好貓。捉老鼠,本來是貓的天...