tableSizeFor的理解
看了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的理解相关推荐
- 育儿知识小分享—— 如何引导孩子学会分享
育儿知识小分享-- 如何引导孩子学会分享 2019-05-15 18:43 来源:东艺幼儿园 原标题:育儿知识小分享-- 如何引导孩子学会分享 现在是一个讲究科学育儿的社会,不管是孩子的教育还是孩子的 ...
- HashMap-链表与红黑树转换触发条件
JDK1.8对HashMap进行了很多优化. 例如当一个槽位slot上的链表个数过多时,则会将链表转换为红黑树,以提高查询检索的效率. 访问节点方式:先找到节点所在的数组index索引位置,然后判断节 ...
- 彻底理解HashMap的元素插入原理
转载自 彻底理解HashMap的元素插入原理 HashMap,是Java语言中比较基础也比较重要的一种数据结构,由于其用途广泛,所以,Java的工程师在设计HashMap的时候考虑了很多因素. 通 ...
- 深入理解Java 容器
Java 容器 Java 容器 一.概览 Collection Map 二.容器中的设计模式 迭代器模式 适配器模式 三.源码分析 ArrayList Vector CopyOnWriteArrayL ...
- 深入理解HashMap(三): 关键源码逐行分析之构造函数
前言 系列文章目录 上一篇我们说明了HashMap的hash算法, 说到HashMap在构造时会自动将table设为2的整数次幂. 本篇我们就来聊聊HashMap的构造函数. 本文的源码基于 jdk8 ...
- HashMap源码分析(深入理解HashMap)
1. HashMap总览 1.1 hashmap底层储存结构图解 底层结构其实就是数组+链表+红黑树 1.2 HashMap类定义 先来看看HashMap的定义: public class HashM ...
- Java 集合深入理解(16):HashMap 主要特点和关键方法源码解读
>点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 前面我们介绍了 哈希相关概念:哈希 哈希函数 冲突解决 哈希表,这篇文章我们来根据 JDK 1.8 源码,深入了解 ...
- 啊哈瞬间之tableSizeFor函数
导读:我记得在<编程珠玑>一书中,作者提到了总有一些优秀的编程思想会让人忍不住发出"啊哈"的声音,这有可能是叹为观止,也有可能是恍然大悟. 1. 简介 tableSiz ...
- Java 集合深入理解 (十一) :HashMap之实现原理及hash碰撞
文章目录 前言 哈希表原理 实现示例 HashMap实现原理 全篇注释分析 实现注意事项 默认属性分析 属性分析 构造方法分析 重要的put方法 总结 前言 哈希表(hashMap)又叫散列表 是一种 ...
最新文章
- 《iOS 9应用开发入门经典(第7版)》——第1章,第1.6节小结
- 潍坊学院的计算机类怎么样,潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!...
- 计算机管理中添加用户属性,如何在计算机右键菜单栏中添加属性选项
- 网页设计中 透明效果的使用技巧
- 【PC工具】更新win10关闭更新工具Windows Update Blocker
- Nmap局域网主机存活发现
- 2016.3.18华为上机题:拼音转数字
- Docker基础(三)—配置镜像加速器
- python绝技运用python成为顶级pdf_python绝技运用Python成为顶级黑客PDF高清文档免费下载...
- 凤凰新闻岳建雄:互联网已经成为传统行业
- 从输入url到页面加载完成中间都发生了什么?
- Sql Server备份时提示:备份文件不可用,原先扇区为512,现在为4096
- 上证50基金有哪些_上证50指数基金,最全选购攻略
- MATLAB逻辑回归实例及代码
- 说出来也许你不信,我被 Linux 终端嘲笑了…….
- 消息队列中:消息可靠性、重复消息、消息积压、利用消息实现分布式事务
- 【小型物体测速仪】只有原理,无代码
- 自己动手打造winpe-只完成了引导的制作和文件夹的构件-仅仅为了学习!
- jQuery01(入门选择器)
- 1小时学Python脚本
热门文章
- 数字图像处理与Python实现-边缘检测-高斯差分(DoG)算子边缘检测
- Failed to send a request to Slack API server: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certif
- python换发型_初学Python的一些细节
- Linux下Firefox和chrome浏览器flash插件的安装
- 谷歌软件工程师是怎样写设计文档的?
- Storage of multidimensional arrays based on arbitrary tiling
- 贝尔曼方程基于全期望公式的前期推导
- LXR和 SourceInsight
- 中国二维码--汉信码(中国主导的首个二维码码制国际标准「汉信码」ISO/IEC 20830:2021《信息技术 自动识别与数据采集技术 汉信码条码符号规范》)
- 美国读计算机博士英语要求,美国读计算机博士一般要几年毕业?入学难不?