HashMap如何實現數組索引的查找?


主要這兩個函數
1.
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
2. tab[(n - 1) & hash]

解析:
獲取key的散列表,即hash值,顯然hash值是int類型,最高32位。如果僅僅通過hash值定位數組的索引,將有10億的范圍。這個范圍太大,以至於內存根本放不下。所以必須對它進行處理。

(n - 1) & hash 通過這個表達式就可以處理。數組的長度是2的n次方,這樣的好處是(n-1)的二進制表達式變為...000...000111...111,最后幾位都是1,這樣和hash進行與操作時只會保留hash值最后面幾位二進制位,大小在0-(n-1),這剛好就是數組的索引。

這時有同學就會奇怪了,這樣不挺好的嗎?為啥還有(h = key.hashCode()) ^ (h >>> 16)這個操作?
先說明一下這個操作,把hashCode的低16位和高16位進行異或處理,得到新的hashCode。至於為什么做,百度了解了下,說這是個擾動策略,可以大大降低hashCode的碰撞,所謂碰撞,就是盡量減少索引落在同一個位置,使其均勻分布,那樣就可以避免或減少鏈表的遍歷了


免責聲明!

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



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