HashMap中數組的初始長度為16,當出現hash沖突時HashMap利用鏈表來解決這個問題.當鏈表長度超過8時,並且桶容量大於等於64時鏈表轉為紅黑樹,否則優先擴容.
其中的哈希函數決定了整個HashMap的效率,
HashMap中的元素超過長度的百分之75時觸發數組擴容.擴大為原來的兩倍,擴容非常消耗性能.數組的初始化長度最好為2的冪.
回到標題,
假設張三手寫了個HashMap,數組長度為10,前面提到哈希函數采用的是位運算的方式.hash算法的hash計算結果往往取決於HashCode值的最后幾位
第一個數計算Hash值
第二個數計算Hash值
第三個數計算Hash值
雖然HashCode的倒數第二第三位從0變成了1,但是運算的結果都是1001。當HashMap長度為10的時候,有些index結果的出現幾率會更大,而有些index結果永遠不會出現(比如0111)
而長度為2的冪時,Length-1的值是所有二進制位全為1,這種情況下,index的結果完全取決於HashCode后幾位的值。只要輸入的HashCode本身分布均勻,Hash算法的結果就是均勻的。