最近在看java集合的源码,看到了HashMap,网上HashMap讲的最好的是美团技术团队的一篇文章,链接https://tech.meituan.com/java-hashmap.html。其中讲到HashMap的扩容机制,有这么一段话:因此,我们在扩充HashMap的时候,不需要像JDK1.7的实现那样重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”。对照源码如下:if ((e.hash & oldCap) == 0) 。源码中使用原来的hash值和原来的容量进行匹配,对着源码和上面这一段话,看半天没看明白。后来又重头看了一次,这次终于发现了真正的技术所在。HashMap在进行put的时候,是用hash & cap-1。假设cap是16,hashmap的cap总是2的次幂。那么hash & 00001111就是这个值得位置所在。当从16扩容到32之后,使用hash & oldcap也是就是hash 00010000来决定当前这个值是放在原索引还是放在原索引+oldcap。上面那句话说的新增的bit,其实就是从右往左数的第五个bit位。到这里终于看明白了。
java HashMap的一点总结
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本文转自 https://zhuanlan.zhihu.com/p/21673805 美团点评技术团队· 3 个月...