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的整数次幂问题?_java

  • 好处:
    1,使元素分布均匀
    2,&的运算速度比%快
    3,保证结果在n以内,不会超出它的容量
  • 2,关于hash值?
    hashMap的默认容量为16.
  • HashMap中容量为2的整数次幂问题?_运算速度_02

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

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