為後來者解惑!
先丟擲倆個問題:
1.為什麼hashmap的容量約定是the power of 2 size呢
2.基於問題1的前提下,為什麼不是32,或者8呢
回答:hashmap是基於陣列的,原始碼: transient Node
table俗稱hash桶(hash bin),將一個元素放到桶裡時,不是像arraylist那樣按順序放,而是根據key的hash值來計算index。
這個時候就會產生hash碰撞,即如果演算法不合法,key會大機率的計算到同一個index,從而使元素都放在同一個桶中。
為了減少雜湊碰撞的機率,我們需要一個演算法,該演算法能讓元素比較平衡的放到不同的桶中,最簡單的方式就是key.hash % table.length,為了效率,使用了位與&運算子。原始碼中使用了tab[i = (n - 1) & hash]。
當n=the power of 2時,n-1的二進位制的後幾位全是1,這時與操作更均勻。問題2,Maybe a tradeoff between speed, utility, and quality of bit-spreading.
為後來者解惑!
先丟擲倆個問題:
1.為什麼hashmap的容量約定是the power of 2 size呢
2.基於問題1的前提下,為什麼不是32,或者8呢
回答:hashmap是基於陣列的,原始碼: transient Node
table俗稱hash桶(hash bin),將一個元素放到桶裡時,不是像arraylist那樣按順序放,而是根據key的hash值來計算index。
這個時候就會產生hash碰撞,即如果演算法不合法,key會大機率的計算到同一個index,從而使元素都放在同一個桶中。
為了減少雜湊碰撞的機率,我們需要一個演算法,該演算法能讓元素比較平衡的放到不同的桶中,最簡單的方式就是key.hash % table.length,為了效率,使用了位與&運算子。原始碼中使用了tab[i = (n - 1) & hash]。
當n=the power of 2時,n-1的二進位制的後幾位全是1,這時與操作更均勻。問題2,Maybe a tradeoff between speed, utility, and quality of bit-spreading.