HashMap中容量为2的整数次幂问题?

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,这样下标结果肯定为偶数
    导致所有的数据都只能存放在偶数位置。
    HashMap中容量为2的整数次幂问题?
    好处:
    1,使元素分布均匀
    2,&的运算速度比%快
    3,保证结果在n以内,不会超出它的容量

  • 2,关于hash值?

    hashMap的默认容量为16.
    HashMap中容量为2的整数次幂问题?
    hashMap中的hash作了特殊处理,将key的hashCode值h进行右移16位(h >>> 16)
    然后将h与右移后的h做异或运算。实际就是把一个数的低16位和高16位做异或运算。
    在(n - 1) & hash 的计算中,hash变量只有末x位会参与到运算。使高16位也参与到hash的运算能减少冲突。
    HashMap中容量为2的整数次幂问题?

  • 3,n永远是2次幂?

    如果初始化的容量不是2的整数次幂,回通过方法tableSizeFor返回一个2的整数次幂。
    HashMap中容量为2的整数次幂问题?