2010-11-08 40 views
31

對於可存儲在HashMap中的關鍵條目的數量是否存在理論上的限制,還是純粹取決於可用的堆內存?可以存儲在HashMap中的鍵(對象)的數量的理論極限?

另外,哪個數據結構最適合存儲大量對象(比如說幾十萬個對象)?

+0

你的意思是詢問有關唯一鍵的數量或條目數?我可以宣誓HashMap是用桶構建的,所以儘管最多有Integer.MAX_VALUE桶,但它們每個都可以有一個包含許多條目的列表。 – Phil 2010-11-08 12:32:18

+3

有趣的問題,得到我的+1 – 2010-11-08 12:32:53

+1

不同的人有不同的想法大。你能更具體一點嗎,你的意思是100s,1000s,數百萬,數百萬,萬億? – 2010-11-08 12:36:15

回答

39

對於可存儲在HashMap中的關鍵條目的數量是否存在理論上的限制還是純粹依賴於可用的heapmemory?

綜觀the documentation of that class,我會說,理論極限是Integer.MAX_VALUE(2 -1 = 2147483647)元素。

這是因爲要正確實現此類,size()方法必須返回表示鍵/值對數的int

HashMap.size()

返回文檔:鍵 - 值映射在這個地圖

注數:這個問題是非常相似的How many data a list can hold at the maximum


其數據結構是最好的存儲非常大量的對象(比如幾十萬對象)?

我會說這取決於你需要存儲什麼,你需要什麼類型的訪問。所有內置的集合都可能爲大批量優化。

+3

提及大小+1。 – Bozho 2010-11-08 12:32:27

+0

我沒有閱讀評論,我沒有意識到這個限制... – pgras 2010-11-08 12:36:08

+0

而我只注意到size():int方法:) – pgras 2010-11-08 12:41:20

10

HashMap將數值保存在一個數組中,該數組最多可容納Integer.MAX_VALUE。但這不包括衝突。每個Entry有一個next字段,這也是一個條目。這是如何解決衝突(具有相同散列碼的兩個或多個對象)。所以我不會說有任何限制(除了可用內存)

注意,如果你超過Integer.MAX_VALUE,你會從一些方法得到意想不到的行爲,像size(),但get()put()仍然可以工作。他們將工作,因爲任何對象的hashCode()將返回一個int,因此根據定義,每個對象將適合在地圖中。然後每個物體將與現有物體發生碰撞。

+1

HashMap#size()的文檔實際上將鍵值映射的數量限制爲一個由int表示的數字。如果HashMap允許更多映射,則size()方法的文檔將從Map#size()繼承,它定義瞭如果大小> Integer.MAX_VALUE時返回Integer.MAX_VALUE的方法。 – jarnbjo 2010-11-08 12:40:57

+0

'hashCode()'返回'int'。因此,在桌子滿了之後,只會有碰撞。 – Bozho 2010-11-08 12:44:21

0

我同意@ Bozho's,並且還會補充說您應該仔細閱讀HashMap上的Javadoc。請注意它如何討論初始容量和加載因子以及它們將如何影響HashMap的性能。

對於保存大量數據(只要你沒有用完密鑰或內存),HashMap是完全正確的,但性能可能是一個問題。

如果您發現無法在單個Java/JVM程序中操作所需的數據集,則可能需要查看分佈式緩存/數據網格。

0

沒有理論上的限制,但存儲桶存儲不同條目鏈(存儲在不同的hashkey下)的限制。一旦你達到這個極限,每一個新的加法都將導致哈希碰撞 - 但這不是一個問題,除了性能...

相關問題