该方法的目的是返回一个大于输入值 c 的2的幂。接下来我们看下这个方法:
static final int tableSizeFor(int c) {
int n = c - 1; //减一的作用是防止输入的值正好是2的幂,得到比输入值大一倍的值,例如 c = 8,如果不减1的话return 16
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;
}
其实
int n = c - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
这一部分的作用就是把二进制从第一个有1开始的后面全部变为1。比如一个二进制是 1010001,则经过此过程后变为1111111。这是按最坏的输入来计算的。
例如输入了,c = 00100000 00000000 00000000 00000001
- int n = c - 1;
n = 00100000 00000000 00000000 00000000
- n |= n >>> 1;
n = 00110000 00000000 00000000 00000000
- n |= n >>> 2;
n = 00111100 00000000 00000000 00000000
- n |= n >>> 4;
n = 00111111 11000000 00000000 00000000
- n |= n >>> 8;
n = 00111111 11111111 11000000 00000000
- n |= n >>> 16;
n = 00111111 11111111 11111111 1111111
- 1
return 01000000 00000000 00000000 00000000
正好是2的幂,太牛了。
网友评论