千鋒教育Java入門(mén)全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java

在Java的HashMap中,當(dāng)一個(gè)桶(bucket)中的鏈表長(zhǎng)度超過(guò)8時(shí),會(huì)將該鏈表進(jìn)行樹(shù)化(轉(zhuǎn)換為紅黑樹(shù)),以提高查找效率。但是,并不是所有的超過(guò)8的鏈表都會(huì)立即樹(shù)化。
實(shí)際上,在進(jìn)行樹(shù)化之前,還需要判斷當(dāng)前HashMap中的桶的數(shù)量是否達(dá)到了64個(gè)。只有當(dāng)桶的數(shù)量超過(guò)64時(shí),才會(huì)進(jìn)行樹(shù)化操作。這是因?yàn)樵谕皵?shù)量較少時(shí),使用鏈表的查找效率仍然比使用紅黑樹(shù)更高。
當(dāng)發(fā)生桶擴(kuò)容時(shí),即添加新的桶時(shí),需要對(duì)原來(lái)的元素進(jìn)行重排。這是因?yàn)閿U(kuò)容會(huì)改變存儲(chǔ)元素的桶索引,原本在同一個(gè)桶中的元素可能會(huì)散布到新的桶中。這個(gè)過(guò)程會(huì)重新計(jì)算元素的哈希值,并根據(jù)新的索引位置進(jìn)行存儲(chǔ)。在這個(gè)過(guò)程中,原本在一個(gè)鏈表中的元素可能會(huì)被拆分到多個(gè)鏈表中,因此原來(lái)的鏈表可能會(huì)變短。
需要注意的是,樹(shù)化和桶擴(kuò)容都是為了維護(hù)HashMap的性能和平衡。樹(shù)化是為了在鏈表長(zhǎng)度過(guò)長(zhǎng)時(shí)提高查找效率,而桶擴(kuò)容則是為了避免哈希沖突過(guò)多導(dǎo)致長(zhǎng)鏈表的產(chǎn)生,以均衡元素在哈希桶中的分布。
為了保證HashMap的散列算法正常運(yùn)行,確保n是2的冪次方有兩種方法:
- 擴(kuò)容時(shí)每次擴(kuò)倍:HashMap在進(jìn)行擴(kuò)容時(shí),會(huì)將當(dāng)前的容量擴(kuò)大為原來(lái)的兩倍。這樣擴(kuò)容后的容量一定是2的冪次方。
- 帶參構(gòu)造時(shí)轉(zhuǎn)換為大于指定長(zhǎng)度的最近的2的冪次方:HashMap在使用帶參構(gòu)造函數(shù)時(shí),會(huì)將指定的初始容量值轉(zhuǎn)換為大于該值且最近的2的冪次方作為實(shí)際的容量。例如,如果指定的初始容量為7,HashMap會(huì)將容量設(shè)置為8。