• 【转载】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。接着

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

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

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

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

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

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

    现在回来看看第一条语句:

    int n = cap - 1;

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

      这种方法的效率非常高,可见Java8对容器优化了很多,很强哈。其他之后再进行分析吧。

    转载地址:https://www.cnblogs.com/loading4/p/6239441.html  支持原创

  • 相关阅读:
    获取自己的网络出口IP地址
    go语言开发IDE
    国内可用的python源
    Tomcat 配置及优化
    大小不固定的图片和多行文字的垂直水平居中
    行内元素与块级元素比较全面的区别和转换
    常用的四种CSS样式表格
    JS鼠标事件大全
    Javascript 5种方法实现过滤删除前后所有空格
    JavaScript trim 实现(去除字符串首尾指定字符)
  • 原文地址:https://www.cnblogs.com/wenbochang/p/8644561.html
Copyright © 2020-2023  润新知