【转】 https://blog.csdn.net/fan2012huan/article/details/51097331

首先看下该方法的定义以及被使用的地方

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;
} public HashMap(int initialCapacity, float loadFactor) {
// code...
this.threshold = tableSizeFor(initialCapacity);
}

tableSizeFor()这个方法的作用是找到大于等于给定容量的最小2的次幂值

>>>这个符号在java里是无符号右移的意思。

接下来分析一下这个方法的作用。

第一句

int n = cap - 1;

先不用考虑,我们分析完后面的之后再回过头来看它

然后是第二句

n |= n >>> 1;

我们这里假设n的初始值为9,那么9的二进制表示是

00000000 00000000 00000000 00001001

那么经历一次右移之后,二进制表示是

00000000 00000000 00000000 00000100

这两个值进行异或之后,就是

00000000 00000000 00000000 00001100

这里我们如果看最高的1的话,那么可以发现右移1位并且异或之后,使得最高位的右边一位也是1.

同理,我们可以下一句右移2位并且异或之后,使得最高两位1的后两位也是1.

我们之后运行到最后一个右移,可以发现n的值变为了

00000000 00000000 00000000 00001111

当然该值大于1并且小于最大值那么+1之后,该值就变成了

00000000 00000000 00000000 00010000

惊讶的发现这个值不就是2的次幂嘛!!!

此时我们回到第一句-1,如果给定的n已经是2的次幂,但是不进行-1操作的话,那么得到的值就是大于给定值的最小2的次幂值。

至于为什么右移到16位,可以得到的最大值是32个1

11111111 11111111 11111111 11111111

这个是因为java的int类型用4个字节32位来进行存储的。最往后没有意义。

HashMap中 工具方法tableSizeFor的作用的更多相关文章

  1. Java中hashCode()方法以及HashMap()中hash()方法

    Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...

  2. Java基础:HashMap中putAll方法的疑惑

    最近回顾了下HashMap的源码(JDK1.7),当读到putAll方法时,发现了之前写的TODO标记,当时由于时间匆忙没来得及深究,现在回顾到了就再仔细思考了下 @Override public v ...

  3. Cstring中GetBuffer()方法的主要作用

    摘自:http://bbs.csdn.net/topics/310247836 GetBuffer()主要作用是将字符串的缓冲区长度锁定   CString::GetBuffer有两个重载版本: (1 ...

  4. Jquery中addClass方法不起作用的解决方案

    selected类是要在点击后添加上去的新样式,在点击后,发现没有变化,打开开发者工具,发现selected类已经添加成功了. 在这里没有显示成功的主要原因是后添加的样式表优先级更低,我暂时不清楚具体 ...

  5. POI中setDefaultColumnWidth方法不起作用的原因

    sheet.setDefaultRowHeight((short) (2 * 256)); //设置默认行高,表示2个字符的高度 sheet.setDefaultColumnWidth(17);   ...

  6. K:HashMap中hash函数的作用

      在分析了hashCode方法和equals方法之后,我们对hashCode方法和equals方法的相关作用有了大致的了解.在通过查看HashMap类的相关源码的时候,发现其中存在一个int has ...

  7. 统计字符串中每种字符出现的评率(HashMap中getOrDefault(K, V)方法的使用)

    为了统计字符串中每种字符出现的频率,使用HashMap这种数据结构.其中,字符作为Key,出现的频率作为Value. 基本算法为: 1. 将字符串分成字符数组 2. (1)如果HashMap中的Key ...

  8. java中native方法的使用

    在非常多情况下,java须要调用其它语言的代码,比方c的代码.那么这个时候java中native方法就发挥作用了.以下就介绍native方法的使用. 一.JNI使用流程 a.编写带有native声明的 ...

  9. Python--day37--多进程中的方法join()

    1,多进程中的方法join()的作用: 感知一个子进程的结束,将异步的程序改为同步 #join() import time from multiprocessing import Process de ...

随机推荐

  1. 数组类的创建——DynamicArray.h

    完成DynamicArray类的具体实现 DynamicArray设计要点——类模板 动态确定内部数组空间的大小 实现函数返回数组长度 拷贝构造和赋值操作 DynamicArray类的声明 templ ...

  2. IT兄弟连 HTML5教程 CSS3揭秘 小结及习题

    小结 CSS3对于开发者来说,给web应用带来了更多的可能性,极大提高了开发效率.CSS3在选择器上的支持可谓是丰富多彩,使得我们能够灵活的控制样式,而不必为元素进行规范化的命名.CSS3支持的动画类 ...

  3. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  4. React 从入门到进阶之路(二)

    在之前的文章中我们介绍了 React 开发的环境搭建及目录介绍和整理,本篇文章将介绍 React 创建组件.JSX 语法.绑定数据和绑定对象. 之前我们已经将项目运行了起来,我们再来看一下目录结构: ...

  5. RobotFramework - IF、FOR语句使用

    一.IF 语句 1. IF语句简单实现 < Log 111111 2. IF语句赋值实现 ${rst} Set Variable If 1 < 2 2 1 3. IF...ELSE实现 $ ...

  6. jquery实现get的异步请求

    <%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...

  7. ant 打包脚本

    现在很多人都用ant脚本来进行打包,下面就介绍一下这个打包工具常见的用法.以及脚本如何编写 <!-- 定义任务,清空任务:清空原有的classes目录,重新创建 --> <targe ...

  8. flutter 打包apk

    打包的具体操作,可以参照官网,只是官网没有那么细 1.修改AndroidManifest.xml 2.构建配置  可以跳过 3.构建签名 4.创建 key.properties 5.配置混淆 6.修改 ...

  9. php代码如何加域名授权?开源php项目如何保护版权 商业授权?

    php在web开发领域是最热门的语言,也是开发项目的不二选择,许多PHP开发者说它是当今世界上最好的开发语言,php开发项目效率高,是因为开源项目太多了,不管是国内,还是国外,开源的框架,开源的CMS ...

  10. LeetCode刷题191118

    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 算法: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按 ...