HashMap通過哈希算法得出哈希值之後,將鍵值對放入哪個索引的方法
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
假設
HashMap的容量爲16轉化成二進制爲10000,length-1得出的二進制爲01111
哈希值爲1111
可以得出索引的位置爲15
假設
HashMap的容量爲15轉化成二進制爲1111,length-1得出的二進制爲1110
哈希值爲1111和1110
那麼兩個索引的位置都是14,就會造成分佈不均勻了,增加了碰撞的機率,減慢了查詢的效率,造成空間的浪費。
總結:
- 因爲2的冪-1都是11111結尾的,所以碰撞機率小。