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

Java8 HashMap之tableSizeFor相关推荐

  1. Java8 HashMap详解

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 ###Java8 HashMap Java8 对 HashMap 进行了一些修改,最大的不同就 ...

  2. Java8 HashMap 扩容之后旧元素存放位置

    Java8 HashMap 扩容之后旧元素存放位置 根据源码可看出,java 在扩容的时候会新建一个新的 Node<K,V>[] 来存放扩容之后的值,并将旧有的Node数组置空: 至于旧有 ...

  3. Java8 HashMap实现原理探究

    2019独角兽企业重金招聘Python工程师标准>>> 前言:Java8之后新增挺多新东西,在网上找了些相关资料,关于HashMap在自己被血虐之后痛定思痛决定整理一下相关知识方便自 ...

  4. Java8 HashMap源码分析

    前言 今天,我们主要来研究一下在Java8中HashMap的数据结构及一些重要方法的具体实现.       研究HashMap的源代码之前,我们首先来研究一下常用的三种数据结构:数组.链表和红黑树. ...

  5. Java8 HashMap 扩容机制与线程安全分析

    如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法. 这篇文章不对 HashMap 中的树进行介绍. 一.Ha ...

  6. HashMap方法tableSizeFor解析

    版权声明:本文为CSDN博主「塔奇库玛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/qq_35296366 ...

  7. Java8 HashMap

    2019独角兽企业重金招聘Python工程师标准>>> Java为数据结构中的映射定义了一个接口java.util.Map 此接口主要有四个常用的实现类,分别是HashMap. Ha ...

  8. java8 hashmap 死循环_踩坑了,JDK8中HashMap依然会死循环!

    作者:Aaron_涛 原文:blog.csdn.net/qq_33330687/article/details/101479385 是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽 ...

  9. HashMap之tableSizeFor

    https://www.cnblogs.com/loading4/p/6239441.html

最新文章

  1. a different object with the same identifier value was already associated with the session解决方案
  2. 〔转〕Word域的应用和详解10_域的应用例子
  3. issubclass和isinstance 反射 内置方法(魔术方法)
  4. VC++源码分析 - 中国象棋源码分析
  5. express-winston 库的学习笔记
  6. Leetcode 5. 最长回文子串(Longest Palindromic Substring)
  7. 找不到天隆虚拟机_玩转虚拟机,教你如何装系统
  8. java 蓝桥杯 数字游戏
  9. Oracle 写存储过程的一个模板还有一些基本的知识点
  10. 新浪推荐 二面 移动零
  11. Windows Server 2003 R2标准版 SP2 64位 (简体中文)官方原版ISO镜像
  12. iOS 开发获取字体类型
  13. 怎样统计PPT演示文稿的字数
  14. 哈工大计算机考研复试考纲,哈尔滨工业大学考研复试大纲
  15. Netty之线程唤醒wakeup
  16. ASPCMS插件,批量ASPCMS采集发布插件
  17. 谜底是计算机病毒的谜语,有关于安全的谜语及谜底答案解析|谜底是粽子的谜语...
  18. 银行计算机岗社会招聘考什么题目,2020各大银行科技岗招聘考试考试内容是什么?...
  19. 减一技术实现求a的n次幂
  20. 期货客户开户手续费(期货开户最低手续费)

热门文章

  1. c++ 结构体中不同类型的初始值_不同类型结构的厂房效果图大盘点
  2. python︱Python进程、线程、协程详解、运行性能、效率(tqdm)
  3. java笔记高级部分
  4. zyplayer-doc 1.0.1 发布,你家所需的文档管理工具他都承包了!
  5. Python多版本管理
  6. 存数字,储未来——新华三2018存储瞄准闪存、海量、AI与超融合
  7. linux系统管理常用命令--top
  8. 60个有用CSS代码片段
  9. Android入门学习2
  10. 【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240