HashMap中扩容时的问题

来源:9-4 HashMap与ConcurrentHashMap解析

深海鱼Q

2018-04-18

老师好,这几天看HashMap的源码,1.7 1.8都看了,在扩容的时候有点疑问

http://img.mukewang.com/szimg/5ad6aa090001fe5c03690275.jpg

比如说像上面那个图,有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。

如果扩容之后元素对应下标都没变化,那就和容量没什么关系了,也可能导致扩容后的空间无法被使用到,你想想看是不是这个道理

0
3
余文乐
回复
Jimin
这篇文章写的非常全面和具体,网上这么多讲HashMap源码的,就它讲的最正确了
2018-04-19
共3条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程