1

我最近讀了一本關於java內存建模的書,它說:HashMap對鍵和值使用弱引用(因爲它們都是對象),所以當hasnmap存儲越來越多的鍵值對時hashmap可以避免內存不足的問題。Java中的HashMap如何處理鍵和值的弱引用?

但問題是:如果鍵和值在GC期間在朗姆酒時間,我怎麼能通過在散列表中使用獲得方法獲得鍵值對?

例如,

String key=new String("GC"); 
String value=new String("GC"); 
hashmap.put(key,value); 

和代碼的某些執行之後,它有一個機會,java的GC鍵和值,那麼是什麼在發生:

hashmap.get(key) 

因爲密鑰在hashmap中不再存在?

+3

這本書是錯誤的:它只有GC清除鍵後,喜歡這裏發生。 HashMap使用強引用。但是有一個WeakHashMap,它的文檔解釋了它是如何工作的:http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html –

+0

有關'WeakHashMap',WeakReference'的相關問題和'SoftReference'是[here](http://stackoverflow.com/questions/154724/when-would-you-use-a-weakhashmap-or-a-weakreference)。 –

+0

謝謝,我認爲這本書是錯誤的... – Qing

回答

2

這是關於WeakHashMap,它刪除不再從外部映射本身引用密鑰的條目。

Map m = new WeakHashMap(); 
    m.put(new Object(), 1);  // key is referenced only by map itself 
    System.out.println(m.size()); // prints 1 
    System.gc();  
    Thread.sleep(1); // give GC some time 
    System.out.println(m.size()); // prints 0 
+0

然後,如何檢索這個鍵值對? – Qing

+0

你不能,它被GC刪除 –

+0

那麼弱引用或弱散列圖的用例是什麼?我不會使用任何在程序中突然指向null的對象..... – Qing