HashMap 总是使用2的幂作为哈希表的大小, 它的计算方式如下
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
算法的整体思路应该是假设原数x的二进制表示中1所在的最高为为第n位,那么就使0~n位的值都设置为1,得到一个新的数再加1即可。
在jupter中运行代码,查看过程,这里就比较容易理解了。
def bprint(n):
print(bin(n))
def closeSize(cap):
n = cap - 1
n = n | n >> 1
bprint(n)
n = n | n >> 2
bprint(n)
n = n | n >> 4
bprint(n)
n = n | n >> 8
bprint(n)
n = n | n >> 16
bprint(n)
return n + 1
closeSize(0x8000+1)
输出