HashMap包含一个哈希表,它是一个保存值的数组。 据我所知,哈希表有一个初始大小,但在调用put()方法多次后,它可以增加(取决于负载因子)。 无论如何,我想知道当你改变哈希表的大小后,如何找到一个值,因为我知道为了计算特定键的哈希码,您可以使用表的大小。 例如,key*prime%size。 那么它是如何工作的?
Visage一般性地回答了这个问题:从键计算出的哈希值通过将它们模除地图的实际大小而映射到桶,并且当地图被调整大小时,所有元素都会再次分散在新的桶范围内。然而,从Java 1.4开始,幕后发生了一些值得知道的事情。首先,在传统的哈希映射中,大小理想上是一个质数,因为这有助于更均匀地将元素分布在桶的范围内。然而,在Java 1.4 HashMap中,大小总是2的幂!这将使标准分布表现非常糟糕,但是在此实现中,哈希值在内部使用非常快速的算法进行重新哈希以平滑分布。更多细节请参见Java Specialist Newsletters,问题54和54b。
如果您查看addEntry(..)方法的代码,您会看到: if (size++ >= threshold) resize(2 * table.length); 在调整大小时,会调用transfer(..)方法,该方法: 将当前表中的所有条目转移到新表中。