HashMap的容量(桶的數量)爲何要是2的n次方

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 ,不一樣位置上,不碰撞;

相關文章
相關標籤/搜索