调用HashMap的put方法时, 如果table为空, 则会先创建一个大小为capacity的 Entry数组, 如果capacity的取值不是2的幂, 则会将其转换为2的幂, 具体就是使用highestOneBit(int i)方法实现的, 总体来说就是: 二进制形式下, capacity中最高位的1保持不变, 其余的1都置零
public static int highestOneBit(int i) {
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
return语句中的i有这么个特点: 从最高位的1到最低位, 都是1, 所以i>>>1之后原先的最高位变成了0, 那么i - (i>>>1)的结果只剩下最高位的1了, 返回该值;
那么问题来了, 为什么return语句中的i有这么个特点? 原因如下
i |= (i >> 1) 的作用:让最高位的1的下一位变成1, 现在最高位和次高位都是1
i |= (i >> 2) 的作用: 让最高位的两个1的接下来的两位变成1, 现在从最高位起, 往下连续4位都是1
i |= (i >> 4) 的作用: 让最高位的4个1的接下来的4位变成1, 现在从最高位起, 往下连续8位都是1
i |= (i >> 8) 的作用: 让最高位的8个1的接下来的8位变成1, 现在从最高位起, 往下连续16位都是1
i |= (i >> 16) 的作用: 让最高位的16个1的接下来的16位变成1, 现在从最高位起, 往下连续32位都是1
执行到这里, 从最高位的1到最低位, 都是1了, 那么i - (i>>>1)的结果只剩下最高位的1
具体的例子, capacity=18时, 其二进制形式为 10010
i |= (i >> 1) 后变成 11011
i |= (i >> 2) 后变成 11111
i |= (i >> 4) 后依然是11111
i |= (i >> 8 后依然是11111;
i |= (i >> 16) 后依然是11111
i-(i>>>1) 的结果是10000, 只剩下最高位的1