Я хотел проверить функциональность 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 implementation, когда ключ и значение имеют одну и ту же ссылку? –
Я не знаю ни одного класса, поставляемого JDK, который бы обеспечил поведение 'WeakHashMap' для' Set'. – rgettman
@IgalIsra Тогда вы, вероятно, захотите [Interner] Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Interners.html#newWeakInterner()). – maaartinus