先看下源码
/**
* Returns a power of two size for the given target capacity.
*/
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;
}
a|=b 为a=a|b
可以试一下,如果n是2的幂次方那就不会变化
那么为什么长度要是2的幂次方呢
Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间。那当然是不能直接拿的。
只能通过映射,就是对数组取模。“ (n - 1) & hash
”。(n代表数组长度)这是公式
取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,
这就解释了 HashMap 的长度为什么是2的幂次方。