【问题标题】:How big should my hashmap be?我的哈希图应该有多大?
【发布时间】:2012-09-10 09:22:53
【问题描述】:

我事先不知道我的 Hashmap 中将存储多少元素。那么我的HashMap容量应该有多大呢?我应该在这里考虑哪些因素?我想尽可能减少重新散列的过程,因为它真的很昂贵。

【问题讨论】:

    标签: java data-structures hashtable


    【解决方案1】:

    您希望在空间需求和速度之间取得良好的平衡(如果发生许多冲突,速度会降低,如果您减少空间分配,则更有可能)。

    你可以定义一个负载因子,默认可能就可以了。

    但您还想避免的是随着哈希表的增长而不得不重建和扩展哈希表。因此,您希望预先设置最大容量。不幸的是,为此,您需要大致知道要投入多少。

    如果您有能力浪费一点内存,并且至少有一个合理的上限来确定内存的大小,那么您可以将其用作初始容量。如果您保持在该容量以下,它将永远不会重新散列。内存需求与容量成线性关系(也许有人有数字)。 请记住,在默认加载因子为 0.75 的情况下,您需要将容量设置为略高于元素数量,因为它会在表格已满 75% 时扩展表格。。 p>

    如果您真的不知道,请使用默认值。不是因为它们在您的情况下是完美的,而是因为您没有任何替代设置的基础。

    好消息是,即使您设置了次优值,它仍然可以正常工作,只是浪费一点内存和/或 CPU 周期。

    【讨论】:

    • loadfactor =1 是什么意思?
    • @Geek 这意味着地图在满之前不会调整大小。如果 loadfactor = 0.75(默认),地图将在 75% 满时调整大小。
    • loadFactor=1 意味着如果你有 X 容量,它会在调整大小之前将 X 元素放入你的 hashmap 中。这里很拥挤,会有碰撞。我相信默认值为 0.75。
    • 负载系数是容器大小与容量的最大比例。这意味着当您达到负载系数时,您需要增加容量。 1 是可能的最大值,这意味着只有在无法添加更多对象时才能增加容量。
    • "full" 是相对的。你可以有 loadFactor=2 我想......(每个桶都是一个开放式列表)
    【解决方案2】:

    documentation 提供了做出合理决定所需的最少必要信息。阅读介绍。我不知道你应该考虑的因素,因为你没有详细说明你的应用程序的性质,预期的负载,......我在这个阶段最好的建议,让它保持默认的 16,然后做一个负载测试(从用户的角度考虑应用程序),您将能够大致计算出您最初需要多少容量。

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2013-01-03
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 2011-08-29
      • 2013-07-24
      • 2011-03-03
      • 2012-06-09
      相关资源
      最近更新 更多