看了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. jquery-1.11.3.js与jquery-1.11.3.min.js区别
  2. python小项目案例-拯救Python新手的几个项目实战
  3. mysql 多列索引的生效规则
  4. 70后存款100万,有房有车无贷款,每月租金1.5万,可以退休吗?
  5. 使用Spring Security保护REST服务
  6. EMLOG SSL插件 一键开启/关闭ssl无需操作数据库
  7. qq影音linux版本下载官网下载软件,QQ for Linux
  8. MacBook Pro下载工具
  9. Unity个人游戏开发总结
  10. numpy到pytorch,鸟枪换炮
  11. 中科院1区JGG微生物专刊征稿
  12. OpenCV深入学习(5)--直方图之calcHist使用
  13. C语言strlen()函数:返回字符串的长度
  14. Android中读values/xml arrays attrs colors dimens string styles
  15. Oracle Namespace 说明
  16. J storm战队成员_DOTA2J.Storm战队介绍-DOTA2PIT深渊联赛预选赛J.Storm战队介绍_牛游戏网攻略...
  17. 【深度学习】超详细的 PyTorch 学习笔记(上)
  18. 史上最全——手把手开发Django网站建设
  19. 七、FFmpeg使用---AAC音频编译
  20. 如何使用 python 接入虹软 ArcFace SDK

热门文章

  1. win10系统文件拖拽卡顿_终于找到Win10卡顿病根了!看完秒懂
  2. Zerg 族历史简介
  3. XMind中记笔记的一些实用技巧!
  4. 万能Ghost系统制作教程(转)
  5. 《C Primer Plus》第五章-运算符 表达式和语句(笔记、复习题、编程题,副作用和序列点,升降级)
  6. Android关闭屏幕,但不休眠
  7. 3Dtouch 基本原理
  8. 钉钉用不同的手机签到后台怎么显示的代签到有用吗
  9. python repr函数_python的str和repr函数
  10. ReactNative中国省-市-区WheelPicker组件