2016-11-08 78 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