原因:當數組的長度很短時,只有低位數的hashcode值能參與運算。而讓高16位參與運算可以更好的均勻散列,減少碰撞,進一步降低hash沖突的幾率。並且使得高16位和低16位的信息都被保留了。
而在這里采用異或運算而不采用& ,| 運算的原因是 異或運算能更好的保留各部分的特征,如果采用&運算計算出來的值的二進制會向1靠攏,采用|運算計算出來的值的二進制會向0靠攏
然后有不少博客提到了因為int是4個字節,所以右移16位。我打開hashmap的源碼,找到hash方法,按住ctrl點擊方法里的hashcode,跳轉到Object類,發現hashcode的數據類型是int。int為4個字節,1個字節8個比特位,就是32個比特位,所以16很可能是因為32對半的結果,也就是讓高的那一半也來參與運算所以選擇了16。
復習過程記錄一下
參考博客:
https://blog.csdn.net/weixin_43842753/article/details/105927912