【发布时间】:2018-10-19 13:03:03
【问题描述】:
我很想知道HashMap中容量计算算法的工作原理。
如果我们创建所需容量为 20 的 Object HashMap,那么算法将始终计算下一个最高容量,即 (2^x >20)
下面是jdk实现.....
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;
}
谁能解释一下上述算法是如何工作的,每一步会发生什么。
我了解到,在每一步中,他们都将数字 2 相除并按位或对旧值进行运算。 他们这样做是因为他们必须分配下一个大于 n 的 (2^x) 值,
但是有人可以帮我解释每一步中某些数字会发生什么,我尝试调试但感觉很复杂。
我有一些实现,如下所示..
private static int calculateCapacity(int cap){
int max_capcity = 256;
if(cap<16){
return 16;
}else if(cap <32){
return 32;
}else if(cap <64){
return 64;
}else if(cap < 128){
return 128;
}
return max_capcity;
}
上面的实现可以用来代替复杂的按位和右移一,这有什么意义。
【问题讨论】:
-
值得一提的是,这在 JDK 11
int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1)中有所改变,最后一行与 JDK 1.8 中的相同。哪个更容易理解,更少混乱。
标签: java algorithm data-structures bitwise-operators