【发布时间】:2012-09-10 09:22:53
【问题描述】:
我事先不知道我的 Hashmap 中将存储多少元素。那么我的HashMap 的容量应该有多大呢?我应该在这里考虑哪些因素?我想尽可能减少重新散列的过程,因为它真的很昂贵。
【问题讨论】:
标签: java data-structures hashtable
我事先不知道我的 Hashmap 中将存储多少元素。那么我的HashMap 的容量应该有多大呢?我应该在这里考虑哪些因素?我想尽可能减少重新散列的过程,因为它真的很昂贵。
【问题讨论】:
标签: java data-structures hashtable
您希望在空间需求和速度之间取得良好的平衡(如果发生许多冲突,速度会降低,如果您减少空间分配,则更有可能)。
你可以定义一个负载因子,默认可能就可以了。
但您还想避免的是随着哈希表的增长而不得不重建和扩展哈希表。因此,您希望预先设置最大容量。不幸的是,为此,您需要大致知道要投入多少。
如果您有能力浪费一点内存,并且至少有一个合理的上限来确定内存的大小,那么您可以将其用作初始容量。如果您保持在该容量以下,它将永远不会重新散列。内存需求与容量成线性关系(也许有人有数字)。 请记住,在默认加载因子为 0.75 的情况下,您需要将容量设置为略高于元素数量,因为它会在表格已满 75% 时扩展表格。。 p>
如果您真的不知道,请使用默认值。不是因为它们在您的情况下是完美的,而是因为您没有任何替代设置的基础。
好消息是,即使您设置了次优值,它仍然可以正常工作,只是浪费一点内存和/或 CPU 周期。
【讨论】:
1 是可能的最大值,这意味着只有在无法添加更多对象时才能增加容量。
documentation 提供了做出合理决定所需的最少必要信息。阅读介绍。我不知道你应该考虑的因素,因为你没有详细说明你的应用程序的性质,预期的负载,......我在这个阶段最好的建议,让它保持默认的 16,然后做一个负载测试(从用户的角度考虑应用程序),您将能够大致计算出您最初需要多少容量。
【讨论】: