jdk8 hashmap tableSizeFor的理解

 /**
     * 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;
    }

代码是这样子,效果是为了获取一个2的指数大小的目标大小。

这里运算有一个重要的概念:

2进制的数,如果任意位都为1,如:111111,这样的数 +1后,会变成:1000000,而这个数必为2的指数。

 

所以,这个方法设计的时候,首先要考虑的是得到一个1111111这样的数,然后要加1。

然后还有一点,加入cap这个传进来的容量,就是一个2的指数呢?

这个时候,比如,传入的是2,结果会得到4,传入4,得到8,这样子就造成浪费,也与使用者的意图不符。

>>> 代表无符号右移,在正数的时候和>>是一样的。

 

posted @ 2021-06-22 11:43  不加班不熬夜的男子  阅读(71)  评论(0编辑  收藏  举报