我想測試Java WeakHashMap中類功能,併爲此事我寫了下面的測試:的Java WeakHashMap中類
public class WeakHashMapTest {
public static void main(String args[]) {
Map<String, Object> weakMap = new WeakHashMap<>();
String x = new String("x");
String x1 = new String("x1");
String x2 = new String("x2");
weakMap.put(x, x);
weakMap.put(x1, x1);
weakMap.put(x2, x2);
System.out.println("Map size :" + weakMap.size());
// force all keys be eligible
x=x1=x2=null;
// call garbage collector
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Map size :" + weakMap.size());
System.out.println("Map :" + weakMap);
}
}
運行下課後WeakMapTest我感到不高興得到以下的輸出:
gc之前的地圖:{x = x,x1 = x1,x2 = x2} gc後的地圖:{x = x,x1 = x1,x2 = x2}
當我預計地圖將爲空時。
也就是說,垃圾收集器沒有做它的工作。但爲什麼?
當我使用上面演示的代碼和新的Object()時,它確實工作正常,但是當我想要類似Set實現時,鍵和值具有相同的引用時,我該怎麼辦? –
我不知道任何JDK提供的類會爲'Set's提供'WeakHashMap'類行爲。 – rgettman
@IgalIsra然後你可能需要[番石榴的干擾者](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Interners.html#newWeakInterner())。 – maaartinus