HashMap实现问题

3
HashMap包含一个哈希表,它是一个保存值的数组。
据我所知,哈希表有一个初始大小,但在调用put()方法多次后,它可以增加(取决于负载因子)。
无论如何,我想知道当你改变哈希表的大小后,如何找到一个值,因为我知道为了计算特定键的哈希码,您可以使用表的大小。
例如,key*prime%size。
那么它是如何工作的?
3个回答

3
Visage一般性地回答了这个问题:从键计算出的哈希值通过将它们模除地图的实际大小而映射到桶,并且当地图被调整大小时,所有元素都会再次分散在新的桶范围内。然而,从Java 1.4开始,幕后发生了一些值得知道的事情。首先,在传统的哈希映射中,大小理想上是一个质数,因为这有助于更均匀地将元素分布在桶的范围内。然而,在Java 1.4 HashMap中,大小总是2的幂!这将使标准分布表现非常糟糕,但是在此实现中,哈希值在内部使用非常快速的算法进行重新哈希以平滑分布。更多细节请参见Java Specialist Newsletters,问题5454b

2

因为键通常用于定位存储值的桶。重新分配不会影响这一点,因为所有对象都会根据新大小重新分配到新的桶中。


哦,我明白了,你是说在增加大小之后,你遍历所有的值并重新分配它们? - user399950
不,HashMap 的实现是这样的。 - PaulJWilliams

2
如果您查看addEntry(..)方法的代码,您会看到:
if (size++ >= threshold)
   resize(2 * table.length);

在调整大小时,会调用transfer(..)方法,该方法:

将当前表中的所有条目转移到新表中。


它如何回答这个问题? - user399950
最后一部分(在初始部分之后几秒钟添加)有一定程度上实现了。 - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接