看了ConcurrentHashMap和hashMap的源码的时候,发现有一个tableSizeFor的方法,目的是将传进来的参数转变为2的n次方的数值。学习了以后,记录一下

/*** Returns a power of two table size for the given desired capacity.* See Hackers Delight, sec 3.2*/
private static final int tableSizeFor(int c) {int n = c - 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;
}

首先先了解>>>这个运算符代表了什么

/ >>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0
比如7的二进制是111,7>>>2表示右移2位,变成001,即为1

了解了这个运算符再让我们看上面的代码
先允许我们跳过上面的
int n = c - 1;
看下面的 n |= n >>> 1;
假设我们传入的参数为10 即二进制为 1010
那么我们运行了这一句得到的是什么呢
1010 | 0101 = 1111
可以看到我们运行到了这里就可以理解了
下面无非是多移动几位,对于较大的数字进行运算,我们10的例子用不到接下来的
那么我们再做最后一步 n+1
就可以的到2的n次方了10000 (16)
推荐参考

tableSizeFor的理解相关推荐

  1. 育儿知识小分享—— 如何引导孩子学会分享

    育儿知识小分享-- 如何引导孩子学会分享 2019-05-15 18:43 来源:东艺幼儿园 原标题:育儿知识小分享-- 如何引导孩子学会分享 现在是一个讲究科学育儿的社会,不管是孩子的教育还是孩子的 ...

  2. HashMap-链表与红黑树转换触发条件

    JDK1.8对HashMap进行了很多优化. 例如当一个槽位slot上的链表个数过多时,则会将链表转换为红黑树,以提高查询检索的效率. 访问节点方式:先找到节点所在的数组index索引位置,然后判断节 ...

  3. 彻底理解HashMap的元素插入原理

    转载自   彻底理解HashMap的元素插入原理 HashMap,是Java语言中比较基础也比较重要的一种数据结构,由于其用途广泛,所以,Java的工程师在设计HashMap的时候考虑了很多因素. 通 ...

  4. 深入理解Java 容器

    Java 容器 Java 容器 一.概览 Collection Map 二.容器中的设计模式 迭代器模式 适配器模式 三.源码分析 ArrayList Vector CopyOnWriteArrayL ...

  5. 深入理解HashMap(三): 关键源码逐行分析之构造函数

    前言 系列文章目录 上一篇我们说明了HashMap的hash算法, 说到HashMap在构造时会自动将table设为2的整数次幂. 本篇我们就来聊聊HashMap的构造函数. 本文的源码基于 jdk8 ...

  6. HashMap源码分析(深入理解HashMap)

    1. HashMap总览 1.1 hashmap底层储存结构图解 底层结构其实就是数组+链表+红黑树 1.2 HashMap类定义 先来看看HashMap的定义: public class HashM ...

  7. Java 集合深入理解(16):HashMap 主要特点和关键方法源码解读

    >点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 前面我们介绍了 哈希相关概念:哈希 哈希函数 冲突解决 哈希表,这篇文章我们来根据 JDK 1.8 源码,深入了解 ...

  8. 啊哈瞬间之tableSizeFor函数

    导读:我记得在<编程珠玑>一书中,作者提到了总有一些优秀的编程思想会让人忍不住发出"啊哈"的声音,这有可能是叹为观止,也有可能是恍然大悟. 1. 简介 tableSiz ...

  9. Java 集合深入理解 (十一) :HashMap之实现原理及hash碰撞

    文章目录 前言 哈希表原理 实现示例 HashMap实现原理 全篇注释分析 实现注意事项 默认属性分析 属性分析 构造方法分析 重要的put方法 总结 前言 哈希表(hashMap)又叫散列表 是一种 ...

最新文章

  1. 《iOS 9应用开发入门经典(第7版)》——第1章,第1.6节小结
  2. 潍坊学院的计算机类怎么样,潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!...
  3. 计算机管理中添加用户属性,如何在计算机右键菜单栏中添加属性选项
  4. 网页设计中 透明效果的使用技巧
  5. 【PC工具】更新win10关闭更新工具Windows Update Blocker
  6. Nmap局域网主机存活发现
  7. 2016.3.18华为上机题:拼音转数字
  8. Docker基础(三)—配置镜像加速器
  9. python绝技运用python成为顶级pdf_python绝技运用Python成为顶级黑客PDF高清文档免费下载...
  10. 凤凰新闻岳建雄:互联网已经成为传统行业
  11. 从输入url到页面加载完成中间都发生了什么?
  12. Sql Server备份时提示:备份文件不可用,原先扇区为512,现在为4096
  13. 上证50基金有哪些_上证50指数基金,最全选购攻略
  14. MATLAB逻辑回归实例及代码
  15. 说出来也许你不信,我被 Linux 终端嘲笑了…….
  16. 消息队列中:消息可靠性、重复消息、消息积压、利用消息实现分布式事务
  17. 【小型物体测速仪】只有原理,无代码
  18. 自己动手打造winpe-只完成了引导的制作和文件夹的构件-仅仅为了学习!
  19. jQuery01(入门选择器)
  20. 1小时学Python脚本

热门文章

  1. 数字图像处理与Python实现-边缘检测-高斯差分(DoG)算子边缘检测
  2. Failed to send a request to Slack API server: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certif
  3. python换发型_初学Python的一些细节
  4. Linux下Firefox和chrome浏览器flash插件的安装
  5. 谷歌软件工程师是怎样写设计文档的?
  6. Storage of multidimensional arrays based on arbitrary tiling
  7. 贝尔曼方程基于全期望公式的前期推导
  8. LXR和 SourceInsight
  9. 中国二维码--汉信码(中国主导的首个二维码码制国际标准「汉信码」ISO/IEC 20830:2021《信息技术 自动识别与数据采集技术 汉信码条码符号规范》)
  10. 美国读计算机博士英语要求,美国读计算机博士一般要几年毕业?入学难不?