栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HashMap、ConcurrentHashMap的容量为什么总是2的n次幂

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HashMap、ConcurrentHashMap的容量为什么总是2的n次幂

文章目录
      • 前言
      • 一、问题由来
      • 二、为什么?
      • 三、题外话
      • 四、结语

前言

随着这个java行业的内卷越来越严重,鉴别一个技术人实力的标准也越来越高,区别于他人的唯一标准就是深入到java中的每个细节,让别人“无路可走”。

一、问题由来

这个问题的由来有两个方面:一个是咱们前边分享HashMap源码的时候,看到DEFAULT_INITIAL_CAPACITY值上边的注释:The default initial capacity - MUST be a power of two。另外一个是听朋友说他面试的时候被问到了这个问题。这个就是今天这篇文章的前世。

二、为什么?

其实原因也特别简单,不知道兄弟们还记得之前分享文章中的map的路由算法不?如果忘记了可以看这篇文章:金三银四之HashMap剖根问底栏目 。

hashmap的路由算法是一个与运算:n-1 & hash

看见这个等式如果对与运算运用的比较深刻,肯定一下子就明白其中的原因了。
首先,我们先说一下这个计算包含的意义:

  • 该式子的值永远不会大于n-1
  • 该式子是用来路由的,决定新插入的值放进那个链表里

其次,我们用数据假设的推理方法来进行推理证明(我就文字代替数学的符号了):

假设n = 2x-1
那么n-1 = 2x-1
所以(n - 1) & hash的值只出出现两个:0或者n-1。


假设n = 2x
那么n-1 = 2x-1
所以(n - 1) & hash的值会根据hash值得不同分散在链表的不同索引上,保证了数据的均衡

相信看到这里大家已经察觉到问题所在了:这会出现严重的碰撞,数据失衡,java8的红黑树也失去了意义,因此HashMap、ConcurrentHashMap的容量必须是2n。

三、题外话

java是真简单,也是真难,入手很快,但是想成为高手也是真的难,愿我们都能保持热情,乘风破浪,在有限的时间做出最大的成绩,加油。

四、结语

道阻且长,行则将至,行而不辍,未来可期,加油。

原创不易,如果你觉得文章不错,对你的进步有那么一点帮助,那么就给个小心心,如果觉得文章非常对你的胃口,那么欢迎你关注我,或者关注个人的微信公众号 程序猿每日分享,这里有资源,有内推,有和你志同道合的朋友,咱们一起打怪升级。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号