HashMap擴容后是否需要rehash?


需要,因為要重新計算舊數組元素在新數組地址。HashMap在JDK1.8中的rehash算法(也就是擴容后重新為里面的鍵值對尋址的算法)進行優化。hash尋址算法是 index =(n - 1) & hash

在JDK1.7的時候,是將數組擴容為兩倍,然后將HashMap中所有的key重新進行hash尋址然后再放入到新的位置。在JDK1.8的HashMap的源碼中,也將rehash算法最后尋址分為了兩種情況:

擴容前,key1和key2的hash值不同,但是通過hash尋址算法后索引相同;擴容后,key1和key2的hash值不同,通過hash尋址算法后索引不同。

元素在重新計算hash(rehash)之后,因為n變為2倍,那么n-1的mask范圍在高位多1bit(紅色),未擴容時,hash值的這個位置的值無論是0還是1對最終的結果都沒有影響,因為對應的 n - 1的這個位置的值是0,進行&操作之后,無論何時都是0,而擴容之后hash值的這個位置,如果是0,那么rehash之后還是在原來的位置index;如果是1,那么rehash之后的位置是原來的位置 + 擴容前的數組容量,即index + oldCap。因此新的index就會發生這樣的變化:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM