今天学习HashMap源码,看见源码里的一个方法,有点看不懂,特此一记;
/** * 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初始化时决定Map大小的一个方法,我搞不懂 "|=" 是什么意思?特地百度了一下。
int a = 1; //1 int b = 3; //11 int c = a | b; //相当于 c |= ((a << 1) + 1); System.out.println(c); //3 /** * int c = a | b; 的计算方式为 * a 的二进制为 1 * b 的二进制为 11 * c 的二进制为 11 */
按位或的计算规则为:
1 逐位进行计算;
2 计算数的同位上值,如果均为0,则结果对应位上值为0;
3 除2中情况外,结果对应位上值为1。
解析:c = a | b,a的二进制位1,b的二进制位11,个位上都是1,及c的二进制个位为1,十位上a的二进制为0,b的二进制为1,及c的二进制位1,及c的十进制为3。
System.out.println(4 >> 2); // 4 / 2 ^ 2 向右位移 System.out.println(16 >>> 2); // 4 正数计算时和 >> 是一样的 System.out.println(-16 >>> 2); // 1073741820 无符号右移 System.out.println(4 << 2); // 4 * 2 ^ 2 向左位移