我有一个 HashMap 存储 数百万个条目 。现在为了避免每次达到阈值时重新散列,我想给用户定义的初始容量和负载因子值,以便重新散列最小。在这种情况下,初始容量和负载因子的值应该是多少?

最佳答案

通常,如果您知道 map 中的最大条目 n 数,为了避免调整大小,您可以将 capacity 设置为 n / loadFactor 。您将负载因子设置为反射(reflect)您在空间/时间权衡空间中的特定需求的某个值。如果您不确定什么负载因子是最好的,那么 0.75 的默认值可能是一个不错的起点。

关键点是 capacity 不是 哈希映射在调整大小之前将接受的元素数量,而是底层数组的大小。哈希映射将在调整大小之前接受 loadFactor * capacity 元素。因此,您需要在容量计算中包含 loadFactor

具体来说,如果您使用 loadFactor 的默认 0.75 并且您知道您的 map 将包含 1,000,000 个元素,则必须将容量设置为 1e6 / 0.75 = ~1,333,334 元素以避免调整大小。如果您不确定确切的大小,那么包含一个缓冲区可能是有意义的,这样您就可以合理地确定避免调整大小。

可以说,更好的 API 应该是直接将 capacity 参数定义为在调整大小之前可以添加到集合中的元素数量,然后构造函数执行任何必要的计算以正确设置其内部阈值成员。这与其他结构的“容量”的含义一致,例如 ArrayList

关于java - 大 HashMap 的初始容量和负载因子的用户定义值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41926251/

10-13 02:34