哈希桶的数量

时间:2012-04-30 06:31:48

标签: java hashmap

HashMap文档中,提到:

  • 初始容量只是创建哈希表时的容量
  • 容量是哈希表中的桶数。

现在假设我们的初始容量为16(默认值),如果我们继续添加100个元素,则hashmap的容量为100 * loadfactor。

哈希桶的数量是100还是16?

修改
从我读到的解决方案:桶不仅仅是添加的元素。 以此为观点:因此,如果我们将字符串添加为键,我们将获得一个元素/存储桶,从而导致大量空间消耗/复杂性,我的理解是正确的吗?

5 个答案:

答案 0 :(得分:8)

无论是100还是16桶。最有可能会有256个存储桶,但文档无法保证这一点。

来自updated documentation link

  

负载系数衡量哈希表在其容量自动增加之前可以获得多长。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即,重建内部数据结构),以便哈希表大约两次水桶的数量。

(强调我的)

因此,如果我们忽略上面的“近似”这个词,我们确定每当哈希表变为75%满(或者你在构造函数中指定的任何加载因子)时,哈希桶的数量加倍。这意味着每当插入第12,24,48和96个元素时,桶的数量就会翻倍,总共会有256个桶。

但是,正如我在文档片段中所强调的那样,该数字大约以前大小的两倍,因此它可能不是256。事实上,如果替换倒数第二次加倍稍微增加一点,最后一次加倍可能永远不会发生,因此最终的哈希表可能只有134个桶,或者可能大于256个元素。

N.B。我到达了134号,因为它是N的最小整数0.75 * N > 100

答案 1 :(得分:3)

查看HashMap的源代码,我们会看到以下内容:

threshold = capacity * loadfactor
size = number of elements in the map

if( size >= threshold ) {
  double capacity
}

因此,如果初始容量为16且负载系数为0.75(默认值),则初始阈值为12.如果添加第12个元素,容量将上升到32,阈值为24.下一步将是容量64和阈值48等等。

因此,对于100个元素,您应该具有256的容量和192的阈值。

请注意,这仅适用于标准值。如果您知道地图将包含的大致元素数量,则应使用足够高的初始容量创建它,以防止在容量增加时进行复制。

更新

关于容量的说法:即使您定义了不同的初始容量,它也总是2的幂。然后,散列映射将容量设置为2的最小功率,该功率大于或等于提供的初始容量。

答案 2 :(得分:1)

从您的链接:

  

当哈希表中的条目数超过加载因子和当前容量的乘积时,通过调用rehash方法,容量大致加倍。

这意味着如果我们有初始容量16,当它超过时,容量将增加32,下次增加64,依此类推。

在您的情况下,您正在添加100个。因此,当你来到第16个数字时,大小将被添加32,所以现在总大小48.再次你继续添加到第48个数字现在大小将增加64.因此,在你的情况下,桶的总大小是112。

答案 3 :(得分:0)

每个实际项目您将拥有至少一个存储桶。如果添加超过16的项目,则必须调整表格并重新调整表格。

  

现在假设我们的初始容量为16(默认值),如果我们保留的话   将元素添加到100个,hashmap的容量为100 *   loadfactor。

实际上它说:

  

如果初始容量大于最大条目数   除以负载系数,不会发生任何重组操作。

即,如果最多有100个项目且容量为100 / 0.75 = 133,则不应再进行重新散列。请注意,这意味着即使表格未满,也可能必须在接近完整时重新散列。因此,如果您希望< = 100项,使用默认加载因子设置的理想初始容量为~135 +。

答案 4 :(得分:0)

doc

When the number of entries in the hash table exceeds the product of the 
load factor and the current capacity, the capacity is roughly doubled by 
calling the rehash method.

threshold=product of the  load factor and the current capacity

让我们尝试.. hashmap的初始大小是16
默认加载因子是0.75所以第一个阈值是12,所以添加12个元素的下一个容量将是.. (16 * 2)= 32
第二个阈值是24,所以在添加第24个元素之后,下一个容量将是(32 * 2)= 64

依旧......