美文网首页
ConCurrentHashMap中的 tableSizeFor

ConCurrentHashMap中的 tableSizeFor

作者: AlanSun2 | 来源:发表于2019-09-19 21:08 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/wszructx.html