2016-11-08 79 views
-3

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

+7

使用具有初始大小的构造函数吗? –

+0

构造函数是否会阻止地图调整大小? – Stepan

+0

我投票结束这个问题,因为OP没有做任何研究。有一个正是这个目的的构造函数。 – f1sh

回答

5

HashMap的构造函数获取映射的初始大小(以及需要的负载因子)。

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

请参阅[HashMap构造函数](https://docs.oracle.com/ javase/8/docs/api/java/util/HashMap.html#HashMap-int-)以获取更多信息,如果此答案不够清晰。 –

+1

出于可读性原因,我建议编写'1_000_000_007'。 – zyexal

3

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

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

HashMap的大小应该是质数以最小化群集。所述HashMap构造的

过去和当前的实现方式中都将选择一个容量为2(最多2 ),其是大于或等于所提供的容量最小的功率。所以使用素数不起作用。

构造函数会阻止map调整大小吗?

HashMaps不会调整大小。


(注:大小能力是不同的东西。该size()方法返回的数量目前在Map条目。你不能“设置”的大小。)

+0

其实,这是他的问题,而不是如何创建一个初始大小的地图。 –

+0

@ROMANIA \t不,最初的问题是如何创建一个最小尺寸的地图。这是正确的问题。 –

+0

@DaveNewton,这是有争议的,但他希望(根据标题)**在Java中设置Map的最小大小**,而不是**在Java中设置Map的初始大小**。这就是我所理解的 - 他相信'HashMap'会在某些动作中缩小其大小,并且他想要修复最小尺寸。 –

2

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

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

  • 轮高达2
  • 下一个功率容量*达到0.75时仍可能调整。
  • 无论如何都被限制在2^30,因为它是数组大小的2倍。

构造函数会阻止map调整大小吗?

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

+1

实际上,** _当前实现_ **中的HashMap的数量是2的幂。它可能不会改变,但是实现细节不是*接口契约的一部分,不应该被依赖上。它可能并不总是2的幂。 – AJNeufeld