HashMap实现问题

时间:2010-07-27 08:02:33

标签: java hash implementation hashmap

HashMap包含一个哈希表,它是一个包含值

的数组

我理解哈希表有一个初始大小,但是在多次调用put()之后它会增加(取决于负载因子)

无论如何我想知道如何在更改散列表的大小后找到一个值,因为我知道为了计算特定键的has代码,你可以使用表的大小

例如key * prime%size

那它是如何运作的呢?

3 个答案:

答案 0 :(得分:3)

Visage通常会回答这个问题:根据键计算的哈希值通过以模块的实际大小为基础进行扩展来映射到存储桶,并且在调整地图大小时,所有元素都会在新范围内再次传播水桶。

然而,从Java 1.4开始,幕后发生了一些值得了解的事情。首先,在传统的哈希映射中,大小理想情况下是素数,因为这有助于在桶的范围内更均匀地分布元素。但是,在Java 1.4 HashMap中,大小始终是2的幂!这会使标准分布表现得非常糟糕 - 但是,在此实现中,哈希值在内部使用非常快速的算法重新散列以平滑分布。

Java专家简报中的更多详细信息,问题5454b

答案 1 :(得分:2)

因为密钥通常用于定位已放置值的bin。重新分配不会影响这一点,因为根据新的大小将所有对象重新分配给新的bin。

答案 2 :(得分:2)

如果查看addEntry(..)方法的代码,您会看到:

if (size++ >= threshold)
   resize(2 * table.length);

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

  

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