jdk1.8 hash函數 (h = key.hashCode()) 與 (h >>> 16) 異或
jdk1.8確定map坐標的方式是tab[(n-1)&hash] n代表map的length,由於絕大多數情況下 map的length的值小於2^16 (25536),所以大部分情況下是hash的低16位與map的length進行與運算(&),如下例子:
例子1:map的length為8,key的hashcode假設為24421231那么下標計算就是
tab[(8-1)&24421231]
1 000000000000000000000111 2 3 & 4 5 111101001010001101101111 6 7 ---------------------------------------- 8 9 000000000000000000000111 10 11 計算出map的坐標為7
上面是低三位進行運算,如果hash值的第三位更加隨機那么結果就更加隨機,那么如何讓低三位更加隨機 那么就是讓hashcode與hashcode的高16位進行異或運算
如果
length=8時,下標運算結果取決於hashcode的低3位
length=16時,下標運算結果取決於hashcode的低4位
length=32時,下標運算結果取決於hashcode的低5位
length=2^n時,下標運算結果取決於hashcode的低n位
由於和(length-1)進行運算,length的長度多數情況下小於2^16,始終是hashcode的低16位參與運算,甚至更低,要是讓高16位也參與運算那么下標就會更加散列.
& | 的運算結果會讓結果偏向於0和1,沒有更加均勻