對於可存儲在HashMap中的關鍵條目的數量是否存在理論上的限制,還是純粹取決於可用的堆內存?可以存儲在HashMap中的鍵(對象)的數量的理論極限?
另外,哪個數據結構最適合存儲大量對象(比如說幾十萬個對象)?
對於可存儲在HashMap中的關鍵條目的數量是否存在理論上的限制,還是純粹取決於可用的堆內存?可以存儲在HashMap中的鍵(對象)的數量的理論極限?
另外,哪個數據結構最適合存儲大量對象(比如說幾十萬個對象)?
對於可存儲在HashMap中的關鍵條目的數量是否存在理論上的限制還是純粹依賴於可用的heapmemory?
綜觀the documentation of that class,我會說,理論極限是Integer.MAX_VALUE
(2 -1 = 2147483647)元素。
這是因爲要正確實現此類,size()
方法必須返回表示鍵/值對數的int
。
返回文檔:鍵 - 值映射在這個地圖
注數:這個問題是非常相似的How many data a list can hold at the maximum。
其數據結構是最好的存儲非常大量的對象(比如幾十萬對象)?
我會說這取決於你需要存儲什麼,你需要什麼類型的訪問。所有內置的集合都可能爲大批量優化。
HashMap
將數值保存在一個數組中,該數組最多可容納Integer.MAX_VALUE
。但這不包括衝突。每個Entry
有一個next
字段,這也是一個條目。這是如何解決衝突(具有相同散列碼的兩個或多個對象)。所以我不會說有任何限制(除了可用內存)
注意,如果你超過Integer.MAX_VALUE
,你會從一些方法得到意想不到的行爲,像size()
,但get()
和put()
仍然可以工作。他們將工作,因爲任何對象的hashCode()
將返回一個int
,因此根據定義,每個對象將適合在地圖中。然後每個物體將與現有物體發生碰撞。
我同意@ Bozho's,並且還會補充說您應該仔細閱讀HashMap上的Javadoc。請注意它如何討論初始容量和加載因子以及它們將如何影響HashMap的性能。
對於保存大量數據(只要你沒有用完密鑰或內存),HashMap是完全正確的,但性能可能是一個問題。
如果您發現無法在單個Java/JVM程序中操作所需的數據集,則可能需要查看分佈式緩存/數據網格。
沒有理論上的限制,但存儲桶存儲不同條目鏈(存儲在不同的hashkey下)的限制。一旦你達到這個極限,每一個新的加法都將導致哈希碰撞 - 但這不是一個問題,除了性能...
你的意思是詢問有關唯一鍵的數量或條目數?我可以宣誓HashMap是用桶構建的,所以儘管最多有Integer.MAX_VALUE桶,但它們每個都可以有一個包含許多條目的列表。 – Phil 2010-11-08 12:32:18
有趣的問題,得到我的+1 – 2010-11-08 12:32:53
不同的人有不同的想法大。你能更具體一點嗎,你的意思是100s,1000s,數百萬,數百萬,萬億? – 2010-11-08 12:36:15