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,这样子就造成浪费,也与使用者的意图不符。
>>> 代表无符号右移,在正数的时候和>>是一样的。