ConCurrentHashMap中的 tableSizeFor

该方法的目的是返回一个大于输入值 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

  1. int n = c - 1;
n = 00100000 00000000 00000000 00000000
  1. n |= n >>> 1;
n = 00110000 00000000 00000000 00000000
  1. n |= n >>> 2;
n = 00111100 00000000 00000000 00000000
  1. n |= n >>> 4;
n = 00111111 11000000 00000000 00000000
  1. n |= n >>> 8;
n = 00111111 11111111 11000000 00000000
  1. n |= n >>> 16;
n = 00111111 11111111 11111111 1111111
    • 1
return 01000000 00000000 00000000 00000000

正好是2的幂,太牛了。

你可能感兴趣的:(ConCurrentHashMap中的 tableSizeFor)