static final int MAXIMUM_CAPACITY = 1 << 30;
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
/**
* 这是为了防止,cap已经是2的幂。如果cap已经是2的幂, 又没有执行这个减1操作,则执行完后面
* 的几条无符号右移操作之后,返回的capacity将是这个cap的2倍
*/
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;
}
不熟悉位运算符的,补点基础吧:传送门: https://blog.csdn.net/cj_eryue/article/details/107930036
tableSizeFor(int cap)是hashMap中的一个Static函数,主要功能是返回一个比给定整数大且最接近的2的幂次方整数,如给定10,返回2的4次方16;
因此每次右移再或运算是为了将最大位的右边位数逐渐变为1,再+1,即取得该数的最近最大的2的幂;
那为什么是1,2,4,8,16呢?
第一次,移动一位,记为 a = 1,已经处理了1位了;
第二次,再移一位,b = a +1 = 2,已经处理了3位了;
第三次,再移一位,c = a + b + 1 = 4,已经处理了7位了;
第四次,再移一位,d = a + b + c + 1 = 8,已经处理了15位了;
第五次,再移一位,e = a + b + c + d + 1 = 16;
刚好移完。
再来个大点的数:
0011 0000 0000 0000 0000 0000 0000 0000
右移一位:0001 1000 0000 0000 0000 0000 0000 0000
| 0011 1000 0000 0000 0000 0000 0000 0000
右移2位 0000 1110 0000 0000 0000 0000 0000 0000
| 0011 1110 0000 0000 0000 0000 0000 0000
右移4位 0000 0011 1110 0000 0000 0000 0000 0000
| 0011 1111 1110 0000 0000 0000 0000 0000
右移8位 0000 0000 0011 1111 1110 0000 0000 0000
| 0011 1111 1111 1111 1110 0000 0000 0000
右移16位 0000 0000 0000 0000 0011 1111 1111 1111
| 0011 1111 1111 1111 1111 1111 1111 1111
+1 0100 0000 0000 0000 0000 0000 0000 0000
那么为什么hashmap的数组大小一定是2的n次幂呢 ???
下篇文章见~~