(1)演示
(2)调整算法
static final int tableSizeFor(int cap) {
int n = cap - 1;
//>>>表示无符号右移,若正数,则高位补0,若负数补0 例1010(10)>>>1 为0101
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;
}
分析过程
举例说明
1010(10)>>>1结果0101;
1010 |
0101 =1111通过后面的一系列按位或运算1111+1 = 10000(16)
一系列的操作主要是将容量扩展到2的n幂, 3->4 5->8 9->16 17->32,保证后续计算索引(key.hashcode() & (length-1))一切都是为了效率!设计巧妙。