HashMap爲了存取高效,要儘可能較少碰撞,就是要儘可能把數據分配均勻,每一個鏈表長度大體相同。算法
關鍵就在於把當前數據存放到哪個桶中,這個算法就是取模運算。優化
假設:源碼
length:HashMap的容量hash
hash:當前key的哈希值效率
取模運算爲 hash % length二進制
可是,在計算機中,直接取模運算的效率不如位運算(&),什麼是位運算?就是對於二進制數據的按位運算,1和1才得1,其餘都得0,好比:1011 & 1100 = 1000鏈表
sun公司的大牛們發現,當容量爲2的n次方時,hash & (length - 1) == hash % length ,因而就在源碼中作了優化,經過 hash & (length - 1) 來替代取模運算,而前提就是容量必須爲2的n次方。這樣作的好處在於:數據
1. 提升操做運算效率(位運算效率 > 取模運算效率)查詢
2. 減小碰撞,數據均勻分佈,提升HashMap查詢效率計算機
爲何能夠減小碰撞?舉個例子,如今兩個hash分別是2和3,:
好比 length 爲 9 的狀況:3&(9-1)=0 2&(9-1)=0 ,都在0上,碰撞了;
好比 length 爲 8 的狀況:3&(8-1)=3 2&(8-1)=2 ,不一樣位置上,不碰撞;