Java8 HashMap之tableSizeFor

  Java8对许多内置的容器进行了优化与拓展,其中对HashMap的改变尤为大。以后将进行总结。算法

  最近在看HashMap的源码时,发现了里面好多很不错的算法,相比Java7从性能上提升了许多。其中tableSizeFor就是一个例子。tableSizeFor的功能(不考虑大于最大容量的状况)是返回大于输入参数且最近的2的整数次幂的数。好比10,则返回16。该算法源码以下:性能

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

 详解以下:优化

先来分析有关n位操做部分:先来假设n的二进制为01xxx...xxx。接着spa

对n右移1位:001xx...xxx,再位或:011xx...xxxcode

对n右移2为:00011...xxx,再位或:01111...xxxblog

此时前面已经有四个1了,再右移4位且位或可得8个1源码

同理,有8个1,右移8位确定会让后八位也为1。table

综上可得,该算法让最高位的1后面的位全变为1。class

最后再让结果n+1,即获得了2的整数次幂的值了。效率

如今回来看看第一条语句:

int n = cap - 1;

  让cap-1再赋值给n的目的是另找到的目标值大于或等于原值。例如二进制1000,十进制数值为8。若是不对它减1而直接操做,将获得答案10000,即16。显然不是结果。减1后二进制为111,再进行操做则会获得原来的数值1000,即8。

  这种方法的效率很是高,可见Java8对容器优化了不少,很强哈。其余以后再进行分析吧。

相关文章
相关标签/搜索