3 回答
TA贡献2037条经验 获得超6个赞
默认的负载因子是0.75
,即3/4
,这意味着在添加了 100 个值中的 75 个时,将调整内部哈希表的大小。
仅供参考: resize()
只调用了两次。一次是在添加第一个值时,一次是在它达到 75% 时。
为了阻止调整大小,你需要确保第100价值不会引起调整,即size <= capacity * 0.75
又名size <= capacity * 3/4
又名size * 4/3 <= capacity
,所以可以肯定的:
capacity = size * 4/3 + 1
随着size = 100
,这意味着capacity = 134
。
TA贡献1876条经验 获得超5个赞
如有疑问,请阅读文档。文档很好地HashMap解释了initial capacity和 的权衡load-factor。
根据文档,如果initCapacity = (maxEntries / loadFactor) + 1添加条目时不会发生重新哈希操作。在这种情况下,maxEntries是100您指定的,loadFactor将是 的默认负载因子.75。
但是除了设置初始大小以避免重新散列 ( resize()) 之外,您还应该仔细阅读 的文档HashMap以正确调整它,同时考虑初始容量和负载因子。
如果您更关心查找成本而不是空间,那么如果您愿意,可以尝试使用较低的loadFactors.5或较低的s 。在这种情况下,您将使用两个参数创建哈希映射,如下所示:
final float loadFactor = 0.5;
final int maxEntries = 100;
final int initCapacity = (int) maxEntries / loadFactor + 1;
new HashMap<>(initCapacity, loadFactor);
(强调我的)
HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量就是哈希表创建时的容量。负载因子是衡量哈希表在其容量自动增加之前允许达到多满的指标。当哈希表中的条目数超过负载因子和当前容量的乘积时,重新哈希表(即重建内部数据结构),使哈希表具有大约两倍的桶数。
...
作为一般规则,默认负载因子 (.75)在时间和空间成本之间提供了一个很好的权衡。较高的值会减少空间开销,但会增加查找成本(反映在 HashMap 类的大多数操作中,包括 get 和 put)。在设置其初始容量时,应考虑地图中的预期条目数及其负载因子,以尽量减少重新哈希操作的次数。如果初始容量大于最大条目数除以负载因子,则不会发生重新哈希操作。
添加回答
举报