2014-10-30 22 views
0

在Java中,一個java.util.HashMap<Key, Value>可以無提示地溢出,所以內容被刪除而我沒有收到異常或其他通知?如果是的話,我該如何使它顯而易見?Java的HashMap能否默默地溢出?

我的意思是它可以超過物理硬件內存,而不是保留內存的HashMap對象。

+0

這沒有任何意義。 'HashMap的大小動態增長,沒有限制。每個值都有一個特定的鍵值,除非你自己刪除它,否則它會留在那裏(除非你使用'WeakHashMap',如果該項目的唯一引用是地圖,那麼將從地圖中刪除東西) – 2014-10-30 16:28:58

回答

2

不,HashMap s不會自動驅逐元素。如果桶滿了,桶會被擴展,所有元素會自動重新加入。

+0

我的意思是如果它超過物理硬件內存,而不是hashmap對象的保留內存。 – Phil 2014-10-30 16:31:18

+2

@DBRN然後你會收到一個'OutOfMemoryError',並且生活會吸引你。但是你的'HashMap'仍然不會丟失元素。此外,在達到這一點之前,您的GC將以100%的速度持續運行以釋放內存,並且您的程序將非常緩慢...... – 2014-10-30 16:32:31

+0

因此,OutOfMemoryError不會被拋出或不可見? – Phil 2014-10-30 16:34:32

3

docs

當在散列表中的條目的數量超過了 負載率和電流容量的產品,哈希表被重新散列 (即,內部數據結構被重建),這樣的哈希表 有水桶

一個HashMap的大約兩倍的數量絕不會「溢出」,它只會調整。這會一直髮生,直到你用完內存,這將導致very loud error

2

其他答案是正確的,但有一個奇怪的邊緣情況。請參閱Theoretical limit for number of keys (objects) that can be stored in a HashMap?以及有關Map中的條目數多於Integer.MAX_VALUE時會發生什麼情況的討論。

因此,它在理論上是可能的 - 如果你以某種方式設法打破這種限制(這幾乎是不可能的)的JVM倖存處理許多對象(這幾乎是不可能的)程序存活該限制(這幾乎是不可能的),那麼不僅物體開始似乎從你的Map中消失,而且你將在Milliways處獲得早餐的一半,其中如果你今天早上做了六件不可能的事情,爲什麼不呢在Milliways餐廳,宇宙盡頭的餐廳提供早餐。