【问题标题】:Set minimum size of a Map in Java在 Java 中设置地图的最小尺寸
【发布时间】:2017-03-22 08:55:55
【问题描述】:

在我的程序中,键值对经常被添加到Map,直到添加了 1G 对。调整地图大小会减慢该过程。如何将最小 Map 大小设置为,例如 1000000007(这是一个素数)?

【问题讨论】:

  • 使用采用初始大小的构造函数?
  • 构造函数会阻止地图缩小吗?
  • 我投票结束这个问题作为题外话,因为 OP 根本没有做任何研究。有一个构造函数就是为了这个目的。
  • @Stepan,您为什么不直接阅读有关如何使用 initialCapacity 的文档?
  • @Stepan 然后不要删除它——我没有投反对票,但我的意思是,拜托,它就在文档中:/

标签: java dictionary size


【解决方案1】:

HashMap 的构造函数采用地图的初始大小(以及加载因子,如果需要)。

Map<K,V> map = new HashMap<>(1_000_000_007);

【讨论】:

  • 如果这个答案不够清楚,请参阅HashMap Constructor 了解更多信息。
  • 出于可读性原因,我建议写1_000_000_007
【解决方案2】:

如何将最小地图大小设置为,例如 1000000007(这是一个素数)?

使用HashMap(int)HashMap(int, float) 构造函数。 int 参数是容量。

HashMap 的大小应该是最大的,以最小化集群。

HashMap 构造函数的过去和当前实现都将选择大于或等于提供的容量的 2 的最小幂(最多 230)的容量。所以使用素数没有效果。

构造函数会阻止地图缩小吗?

HashMap 不会缩小。


(注意 sizecapacity 是不同的东西。size() 方法返回 Map 中当前条目的数量。你不能“设置" 大小。)

【讨论】:

  • 其实这是他的问题,而不是如何创建具有初始大小的地图。
  • @ROMANIA 不,最初的问题是如何创建最小尺寸的地图。它就在问题中。
  • @DaveNewton ,这是有争议的,但他希望(根据标题)在 Java 中设置地图的最小大小,而不是 设置地图的初始大小在 Java 中。这就是我所理解的 - 他认为HashMap 会在某些操作期间减小其大小,并且他想修复一个最小大小。
【解决方案3】:

你应该注意的事情。 HashMap 中的桶数是 2 的幂(将来可能不会),下一个 2 的幂是 2^30。负载因子决定了它应该增长 Map 的大小。通常为 0.75。

如果您将容量设置为预期大小,它将;

  • 向上取整到 2 的下一次幂
  • 在达到容量 * 0.75 时可能仍会调整大小。
  • 无论如何都限制为 2^30,因为它是数组大小所能拥有的 2 的最大幂。

构造函数会阻止地图缩小吗?

这样做的唯一方法是将所有元素复制到新地图中。这不是自动完成的。

【讨论】:

  • 其实HashMap当前实现中的桶数是2的幂,大概不会变,但是实现细节不是接口契约的一部分,不应该被依赖。它可能并不总是 2 的幂。
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多