java HashMap实现问题
HashMap包含一个哈希表,它是一个保存值的数组
据我所知,哈希表有一个初始大小,但在多次调用put()后,它可能会增加(取决于负载因子)
不管怎样,我想知道在更改哈希表的大小后如何找到一个值,因为我知道为了计算特定键的has代码,可以使用表的大小
例如,key*prime%size
那么它是如何工作的呢
你可以在下面搜索框中键入要查询的问题!
HashMap包含一个哈希表,它是一个保存值的数组
据我所知,哈希表有一个初始大小,但在多次调用put()后,它可能会增加(取决于负载因子)
不管怎样,我想知道在更改哈希表的大小后如何找到一个值,因为我知道为了计算特定键的has代码,可以使用表的大小
例如,key*prime%size
那么它是如何工作的呢
# 1 楼答案
因为密钥通常用于定位您的值所在的箱子。重新分配不会影响这一点,因为所有对象都会根据新的大小重新分配到新的存储箱
# 2 楼答案
Visage大体上回答了这个问题:根据键计算的散列值通过将它们按映射的实际大小展开来映射到bucket,当映射调整大小时,所有元素将再次展开到新的bucket范围中
然而,从Java1.4开始,在幕后发生了一些值得了解的事情。首先,在传统的散列映射中,大小理想情况下是一个素数,因为这有助于在桶的范围内更均匀地分布元素。然而,在Java1.4HashMap中,大小总是2的幂!这将使标准分布表现得非常糟糕-但是,在这个实现中,哈希值在内部使用非常快速的算法来平滑分布
Java专家时事通讯54和54b上有更多详细信息
# 3 楼答案
如果查看
addEntry(..)
方法的代码,您会看到:调整大小时,调用
transfer(..)
方法,该方法: