HashMap tableSizeFor解读
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;
}
目的
返回大于等于cap的最小2的整数次幂,如cap=13,即1101,返回10000。
如何实现
大致思路是先得到与原数最高非0位相同的最大数。如1101,则先得到1111,然后加1就得到了大于等于cap的最小2的整数次幂10000
定义首个非0位后的位视为有效位
n |= n >>> 1,使前两位有效位变为11
n |= n >>> 2,使前四位有效位变为1111
以此类推,每次移动前面移动位数的2倍,使所有有效位变为1