一文看懂HashMap扩容为什么是2的n次幂
HashMap是Java中的集合类,是存放键值对形式的数据(Key和Value),例如QQ账号和QQ密码,QQ账号就是Key而密码则是Value。如下图所示(假如QQ账号为123456,密码为abcdef)
运行结果如下所示
如果存放相同的Key,那么Value将会被覆盖,类似于QQ更改密码,账号不会变,只有密码会进行更改。
运行结果如下所示
首先先看一下HashMap中的putVal方法(存值的)和resize方法(扩容的),之所以HashMap扩容是2的n次幂和这两个方法有千丝万缕的联系。
通过putVal方法可以看出来HashMap在存值时会先把key的hash值和扩容后的长度进行一次按位与运算,其中hash是在hash方法中把key进行计算后的出来的结果,n是扩容的长度(也就是数组的长度,默认为16),然后判断是否hash碰撞在进行不同的存储。如下图源码所示。
通过resize方法可以看出来扩容时会新建一个tab,然后遍历旧的tab,将旧的元素进行e.hash & (newCap - 1)的计算添加进新的tab中,也就是(n - 1) & hash的计算方法,其中n是集合的容量,hash是添加的元素经过hash函数计算出来的hash值。如下图源码所示。
之所以这样2n扩容和上面的两个方法有极大的关系,首先他们都使用了按位与运算,按位与运算就是把值先变成二进制然后进行运算,如果有0则为0,都为1时则输出为1,HashMap默认容量为16那么在存放到数组时就是n-1也就是15,而15二进制则是1111扩容后为32-1及11111111
,如果都为1的情况下是可以极大的减少hash碰撞,增加效率的。
通过下面例子来看一下当容量为11111111时按位与运算的结果,通过下面的结果可以看出来结果很分散,大大减少了hash碰撞的发生。
再看一下当容量不为11111111而是为其他值的时候,通过下面的结果可以看出,1、2、4跟不同的值进行hash运算但是结果却是相同的,也就是发生了hash碰撞。
通过上面的对比可以看出来11111111和其他值
比较大大的减少了hash碰撞的发生,这样就是为什
么HashMap为什么扩容采用2的n次幂的原因。
本文分享自微信公众号 - 大猫的Java笔记(damaoJava)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云 MaxCompute 2020-7 月刊
2020年8月5日 “MaxCompute企业级安全新能力发布”,解读SaaS模式云数据仓库MaxCompute数据的持续保护。了解发布详情>> 【7月新发布功能】 1.MaxCompute使用包年包月计算资源作业支持优先级功能 MaxCompute支持作业优先级的功能可以更合理分配使用包年包月计算资源,给高优先级业务加一道保障。 适用客户适用于MaxCompute使用包年包月计算资源的用户。 发布功能使用MaxCompute包年包月计算资源时,资源池为独享同时也是有限的,而业务优先级不同,对应的任务也有不同优先级,当任务都处在资源等待状态时,通过优先级功能,可以让优先级高的任务优先获取到资源执行,从而更合理分配使用有限的计算资源。 此功能同时支持关联DataWorks调度任务基线优先级,若通过DataWorks使用MaxCompute,且有调度任务,可以根据业务划分调度任务优先级,当调度任务发起MaxCompute job时,对应的优先级会传到MaxCompute转化成MaxCompute的优先级。 开启使用优先级功能前,务必要先梳理好各任务/流程优先级,避免滥用高优先级...
- 下一篇
从零开始理解HTTP协议及报文分析
前言 从事性能测试必不可绕过的就是协议,对基本知识的了解,还是深入掌握协议的机制,都能让你在从事性能测试实施时显得更加顺手。 下面我们就HTTP协议及性能测试过程必须掌握的一些分析工具来进行分享。 重点分享性能测试实施过程中必须掌握的关键技术、工具。更细节的请参考HTTP相关书籍或RFC文档。 HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解。 Web Client可以是浏览器、搜索引擎、机器人等等一切基于HTTP协议发起http请求的工具。 Web Server可以是任何的能解析HTTP请求,并返回给Web Client可识别的响应的服务,常见的有apache、nginx、IIS等等web服务器。 浓缩就是精华,看下最简洁的HTTP交互图: HTTP报文结构 请求报文 HTTP请求报文由请求行、请求头、空行和请求内容4个部分构成。 如下图所示: 下面对上图进行简单的分析: 请求行 由请求方法字段、URL字段、协议版本字段三部分构成,它们之间由空格隔开。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、T...
相关文章
文章评论
共有0条评论来说两句吧...