HashMap中, 不管容量参数是多少, 最终容量都会被重新计算, 按照大于等于输入参数且最小的2的整数次幂的数.
例如: 参数是9, HashMap内部的计算后的容量会是16....容量计算
HashMap中使用tableSizeFor()方法, 计算参数对应容量值, 即大于等于参数且最小的2的整数次幂的数....MAXIMUM_CAPACITY : n + 1;
}
这个方法中所有 ”|=” 计算的目的就是利用或( | )运算,
将数字n(二进制)的第一个值为1的数位的右边所有位都变为1....求大于等于入参的最小2的n次幂
在不超过最大容量时, 执行n+1计算容量值, 即得大于等于入参的最小2的n次幂.
n+1 = 0000 1111 + 1 = 0001 0000 = 16;
这也是方法第一行中先减一的原因...(n - 1) & hash的值是均匀分布的, 能够减少hash冲突;
而容量为2的n次幂的原因是
当n为2次幂时, (n - 1) & hash = hash % n
启示
1.同样需求下, 使用位操作计算效率会高很多