hashMap容量问题:
hashMap是通过key的hash运算,解决key在哪,在java8中,key的位置下标通过(n - 1) & hash计算所得。下标计算方法设计好,将会为查询带来很多好处。
- 1,为什么要保证容量n为2的整数倍?
n为2的整数倍,那么n-1就是一个奇数,奇数的二进制最后一位肯定为1.
为1的好处就是(n-1) & hash的值后一位为0或者为1,如果n不是2的
整数幂,那么(n-1) & hash的运算结果后一位始终为0,这样下标结果肯定为偶数
导致所有的数据都只能存放在偶数位置。 - 好处:
1,使元素分布均匀
2,&的运算速度比%快
3,保证结果在n以内,不会超出它的容量 - 2,关于hash值?
hashMap的默认容量为16. - hashMap中的hash作了特殊处理,将key的hashCode值h进行右移16位(h >>> 16)
然后将h与右移后的h做异或运算。实际就是把一个数的低16位和高16位做异或运算。
在(n - 1) & hash 的计算中,hash变量只有末x位会参与到运算。使高16位也参与到hash的运算能减少冲突。 - 3,n永远是2次幂?
如果初始化的容量不是2的整数次幂,回通过方法tableSizeFor返回一个2的整数次幂。