源码:
/**
* 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;
}
注意: HashMap要求容量必须是2的幂,因为不为2的幂保证不了均匀的分布
- 参数
cap
:是指HashMap的容量大小 int n = cap - 1
:是为了防止cap已经是2的幂时|=
:“|” 是按位或运算符,举例:i |= j
相同于i = i|j
>>>
:无符号右移MAXIMUM_CAPACITY
HashMap的最大容量,MAXIMUM_CAPACITY = 1 << 30
cap = 18;
第一次右移:n |= n >>> 1;
n = 17;转换二进制 n = 10001;
n >>> 1 无符号右移1位 等于 01000;
最后 或运算 10001 | 01000 = 11001;
第二次右移:n |= n >>> 2;
n = 25;转换二进制 n = 11001; (注意
n
的值变化)
n >>> 2 无符号右移2位 等于 00110;
最后 或运算 11001 | 00110 = 11111;
…
第五次右移 :n |= n >>> 16;
n = 31;转换二进制 n = 11111;
n >>> 16 无符号右移16位 等于 00000;
最后 或运算 11111 | 00000 = 11111;
根据图中运算可以得到结论,每一步的目的是将10情况变成11
最后 return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1
判断
n
的值是否小于 0;
true 则返回 1;
false 继续校验n
的大小 是否大于等于 HashMap的最大容量 true 返回MAXIMUM_CAPACITY
,false 返回n + 1
注:n + 1
是HashMap容量必须是2的幂