java HashMap的一点总结

最近在看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位。到这里终于看明白了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容