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

你可能感兴趣的:(java HashMap的一点总结)