【问题标题】:How is it decided that a hashmap has become full, since each hashmap bucket can contain a huge number of entries如何确定一个 hashmap 已经满了,因为每个 hashmap 桶都可以包含大量的条目
【发布时间】:2017-07-13 17:59:40
【问题描述】:

hashmap的大小是根据负载因子增加的,但是如何判断一个hashmap已经满了,因为每个hashmap桶都可以包含大量的条目。为什么它会创建新的存储桶而不是向现有存储桶添加条目?有没有办法确定一个桶中的条目数? 负载系数如何发挥作用?假设初始容量为 16,负载因子为 0.75,那么在存储了多少条目后,hashmap 将被重新散列?因为 16*0.75 是 12,所以是在我们存储 12 个条目后重新哈希,还是在 12 个桶有条目而其余桶为空后重新哈希?这 12 究竟代表什么?

【问题讨论】:

    标签: java collections hashmap


    【解决方案1】:

    hashmap 的完整性是通过条目数相对于桶数来判断的。通常,这两个值只是作为数据成员存储在 hashmap 中,并随着它们的变化而更新。

    将条目添加到现有存储桶会使哈希图变慢,尤其是在搜索不存在的条目时,因为您必须查看存储桶中的每个条目,如果存在的话,所需的值将在其中。

    想象一下,如果您存储的是按名称索引的记录。如果您只有 300 条记录,则按名称的第一个字母对它们进行索引可能没问题。最坏的情况是,如果您正在寻找名字以“S”开头的人,您可能需要查看 20 条记录。但是,如果您有 2,000 条记录,您可能希望通过多个字母对它们进行索引,也就是说,使用超过 26 个存储桶。

    实际上,这正是人们在有大量记录要索引时所做的事情。例如,他们可能会通过将“S”存储桶拆分为“Sa-Sk”和“Sl-Sz”来添加存储桶。

    【讨论】:

    • 我会提到负载因子参数与HashMap的构造函数的连接。
    • 非常感谢您的解释,但我仍有疑问。负载系数如何发挥作用?假设初始容量为 16,负载因子为 0.75,那么在存储了多少条目后,hashmap 将被重新散列?因为 16*0.75 是 12,所以是在我们存储 12 个条目后重新哈希,还是在 12 个桶有条目而其余桶为空后重新哈希?这 12 到底代表什么?
    【解决方案2】:

    因为如果我们将条目添加到现有存储桶中,这些条目将以列表格式存储在存储桶中,并且会增加 get 方法的运行时间。 因为 list 需要 O(n) 来比较一个元素。

    【讨论】:

      【解决方案3】:

      如何确定哈希图已满?

      理论上不能说是满的。我们仍然可以将任意数量的对象添加到存储桶的链表中(如您所说)。

      假设有这么多(键,值)条目添加到 HashMap。理想情况下,HashMap 函数(get、put、contains)必须在 O(1) 中工作。为了实现它,HashMap 的每个桶必须只存储一个(键,值)对。每当哈希映射发生冲突时,它必须重新组织其底层数据结构以促进理想的哈希。为每次碰撞重新组织内部数据结构是一项复杂的操作,它会降低哈希映射的性能。

      因此决定允许一些冲突。当映射中的元素数量达到最大阈值时,将完成哈希映射的重新散列。在重新散列时,底层存储桶将变为双倍,并且 (key,value) 将映射到这些新的存储桶集。

      通过这样做,桶中的(键,值)对的数量通常会减少。 因此,通过使用额外的空间,hash map 效果更好。

      有没有办法确定一个bucket中的条目数?

      在 HashMap 中,我们无法知道每个桶中的条目数。即使我们知道我们不能只拆分那个桶。例如,目前 HashMap 中有 16 个桶,如果我们知道很多 (Key,Value) 对映射到一个桶,我们不能简单地将那个桶分成 2 个。我们不能显式创建一个新桶来分担负载那个桶。在这两种情况下,桶数应为 17。但 HashMap 的桶数应始终为 2 的 n 次方。所以我们不能对知道桶中条目的数量做任何特别的事情。所以在 HashMap 中,bucket 级别的决策不会做。全局决策将根据 HashMap 中的条目数来完成。

      【讨论】:

      • 非常感谢您的解释,但我仍有疑问。负载系数如何发挥作用?假设初始容量为 16,负载因子为 0.75,那么在存储了多少条目后,hashmap 将被重新散列?因为 16*0.75 是 12,所以是在我们存储 12 个条目后重新哈希,还是在 12 个桶有条目而其余桶为空后重新哈希?这 12 到底代表什么?
      • @Abhijay 存储12个条目后会重新散列
      猜你喜欢
      • 1970-01-01
      • 2012-02-09
      • 2016-02-20
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多