HashMap中扩容时的问题
来源:9-4 HashMap与ConcurrentHashMap解析
![](http://img1.sycdn.imooc.com/user/5a1fbd8200018c4303480346-100-100.jpg)
深海鱼Q
2018-04-18
老师好,这几天看HashMap的源码,1.7 1.8都看了,在扩容的时候有点疑问
比如说像上面那个图,有4个Key,都放在了一个桶里,扩容的时候,这4个key不应该还是在一个桶里吗,因为这4个key之前放在一个桶里说明他们hashCode是相同的,在1.7里有一个indexFor()的方法,求出应该存放在哪个桶里的下标,传入的是hash值和新的容量。。他们hash后都是相同的呀,求出的新下标不应该也是相同的吗,这里有点不理解。。。
写回答
1回答
-
Jimin
2018-04-18
你好,hash相同,不代表新下标也是相同的。你这里提到了1.7的indexFor(),我现在本地是jdk8,没法直接看源码,就不贴出来了,你具体看一下,他这里应该是有个取余操作。
我们假设长度由16变成32,16以内的下标确实没变化,但是16以后的就不一定了,比如 17%16=1,17%32=17,再比如33,33%16=1,33%32=1。
如果扩容之后元素对应下标都没变化,那就和容量没什么关系了,也可能导致扩容后的空间无法被使用到,你想想看是不是这个道理
032018-04-19
相似问题