前言
随着这个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是真简单,也是真难,入手很快,但是想成为高手也是真的难,愿我们都能保持热情,乘风破浪,在有限的时间做出最大的成绩,加油。
四、结语
道阻且长,行则将至,行而不辍,未来可期,加油。
原创不易,如果你觉得文章不错,对你的进步有那么一点帮助,那么就给个小心心,如果觉得文章非常对你的胃口,那么欢迎你关注我,或者关注个人的微信公众号 程序猿每日分享,这里有资源,有内推,有和你志同道合的朋友,咱们一起打怪升级。