HashMap jdk8 內部結構重點解析

2021-10-07 19:15:13 字數 2449 閱讀 1327

static

class

node

implements

map.entry

final node

resize()

elseif(

(newcap = oldcap <<1)

< maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr <<1;

// 雙倍擴大老記憶體和老閾值並賦給新的table

}else

if(oldthr >0)

// initial capacity was placed in threshold

newcap = oldthr;

else

if(newthr ==0)

threshold = newthr;

//把新的閾值賦給當前table

@suppresswarnings()

node

newtab =

(node

)new

node

[newcap]

;//建立容量為newcap的新table

table = newtab;

if(oldtab != null)

else

}while

((e = next)

!= null);if

(lotail != null)

if(hitail != null)}}

}}return newtab;

}

重點分析(<--------------------標誌出來的地方)

重點1

if

(e.next == null)

//將為空的元素複製到新table中 ,e.next ==null代表當前桶裡面只有乙個元素,直接把它取模放入新陣列中,它仍然是鍊錶的第乙個元素

newtab[e.hash &

(newcap -1)

]= e;

//等於是建立乙個新的空table然後重新進行元素的put,這裡的table長度是原table的兩倍

重點2

else

if(e instanceof

treenode

)//暫時沒了解紅黑樹

((treenode

)e).

split

(this

, newtab, j, oldcap)

;

重點3

else

else

}while

((e = next)

!= null);if

(lotail != null)

if(hitail != null)

}

重點4

if

((e.hash & oldcap)==0

)else

問:為什麼這裡是e.hash & oldcap 而不是和前面那種類似取模運算的 (e.hash & oldcap-1) ?

答:舉例 有乙個hashcode = 01000110,00000110,00001110 ,原陣列長度為16(1111),取模之後得到索引為1110,即14;

擴容後,hashcode & (00011111) ,結果實際看的是加粗標記的位,如果e.hash & oldcap==0,代表擴容後不需要移動;如果e.hash & oldcap == 1,則代表擴容後索引需要+擴容前陣列長度;

為什麼hashmap中要用2的次冪來算?

答:計算下標時取模運算很慢,用power of 2 可以用位與運算& 來更快優化效能。

hashmap的key可以為null/

答:可以為null,並且陣列的第乙個位置即索引為0的地方專門放null。

為什麼jdk8中樹形結構選用紅黑樹?

答:因為不僅要保證查詢效率,還要保證插入效率,選用紅黑樹是乙個折中的考慮。

只要鍊錶上的數量大於或者等於treeify_threshold,就一定會轉化為紅黑樹?

答:不一定,**裡面還有個引數min_treeify_capacity,只有總的數量大於等於min_treeify_capacity 的時候才能變樹,這也是整體上效能的考量。

為什麼在小於7,轉化為鍊錶,大於7轉化為紅黑樹。

答:首先,紅黑樹不一定查詢就比鍊錶高效,當節點很多時,紅黑樹的效率較高;選擇6和8(如果鍊錶小於等於6樹還原轉為鍊錶,大於等於8轉為樹),中間有個差值7可以有效防止鍊錶和樹頻繁轉換;容器中節點分布在hash桶中的頻率遵循泊松分布,桶的長度超過8的概率非常非常小。

HashMap JDK8 知識彙總

關於hashmap的面試題這兩篇講的不錯 關於hahmap中的變數解釋這篇講的不錯 關於hashmap為什麼不是執行緒安全這篇講的不錯 關於hash演算法講解 解決hash演算法衝突的四種方法 注意 hashmap和hashset是採用拉鍊法解決衝突的.concurrenthashmap在jdk1....

HBase內部結構

table表 就是有乙個或者多個列族組成,加上之前的 使用,這個表概念應該很熟了 row行 乙個行包括了多個列,這些列通過列族來分類 column family列族 列族是多個列的集合,hbase會盡量的將乙個列族的列放入同乙個伺服器內,這樣可以提高訪問效能,並且可以批量管理有關聯的一堆列,所有的資...

Oracle檢視內部結構

1 分析資料檔案塊,轉儲資料檔案n的塊m alter system dump datafile n block m 2 分析日誌檔案 alter system dump logfile logfilename 3 分析控制檔案的內容 alter session set events immediat...