HashMap中, 不管容量参数是多少, 最终容量都会被重新计算, 按照大于等于输入参数且最小的2的整数次幂的数.
例如: 参数是9, HashMap内部的计算后的容量会是16....容量计算
HashMap中使用tableSizeFor()方法, 计算参数对应容量值, 即大于等于参数且最小的2的整数次幂的数....求大于等于入参的最小2的n次幂
在不超过最大容量时, 执行n+1计算容量值, 即得大于等于入参的最小2的n次幂.
n+1 = 0000 1111 + 1 = 0001 0000 = 16;
这也是方法第一行中先减一的原因..., 就是为了保证找到的目标值大于或等于参数.
int n = cap-1;
所以当初始化容量长度的入参为9时, 实际是需要定义长度为16的数组....为什么容量为2的n次幂
在HashMap中, 容量的本质就是hash桶, 每个key会对应到一个hash桶中, 所以能快速定位是非常必要的.