Мне интересно знать, как работает алгоритм расчета емкости в HashMap.
, где, если мы создадим объектную HashMap с некоторой требуемой емкостью 20, тогда алгоритм всегда вычислит следующую наибольшую емкость, т. Е. (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 и делают побитовое ИЛИ к более старому значению.и это они делают, потому что им нужно распределить следующее (2 ^ x) значение больше n,
Но кто-то может помочь объяснить мне на каждом шаге, что происходит с некоторыми числами, я пытался отладить, ноощущение сложности.
Я имею в виду некоторую реализацию, подобную приведенной ниже.
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;
}
вышеприведенную реализацию можно использовать вместо комплексного побитового и правостороннего сдвига, в чем смыслчто.