Пример WeakHashMap
Я создаю WeakHashMap как
WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>();
map.put(emp,"hello");
где emp - объект Employee. Теперь, если я делаю emp = null или скажу, что объект emp больше не ссылается, будет ли удаляться запись из WeakHashMap, будет ли размер карты равен нулю?
И будет ли это наоборот в случае HashMap?
Является ли мое понимание WeakHashMap правильным?
Ответы
Ответ 1
Я запустил код примера, чтобы понять разницу между HashMap
и WeakHashMap
Map hashMap= new HashMap();
Map weakHashMap = new WeakHashMap();
String keyHashMap = new String("keyHashMap");
String keyWeakHashMap = new String("keyWeakHashMap");
hashMap.put(keyHashMap, "helloHash");
weakHashMap.put(keyWeakHashMap, "helloWeakHash");
System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));
keyHashMap = null;
keyWeakHashMap = null;
System.gc();
System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));
Выход будет:
Before: hash map value:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null
Ответ 2
Очень простой пример, чтобы просветить то, что уже было сказано:
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
// -- Fill a weak hash map with one entry
WeakHashMap<Data, String> map = new WeakHashMap<Data, String>();
Data someDataObject = new Data("foo");
map.put(someDataObject, someDataObject.value);
System.out.println("map contains someDataObject ? " + map.containsKey(someDataObject));
// -- now make someDataObject elligible for garbage collection...
someDataObject = null;
for (int i = 0; i < 10000; i++) {
if (map.size() != 0) {
System.out.println("At iteration " + i + " the map still holds the reference on someDataObject");
} else {
System.out.println("somDataObject has finally been garbage collected at iteration " + i + ", hence the map is now empty");
break;
}
}
}
static class Data {
String value;
Data(String value) {
this.value = value;
}
}
}
Выход:
map contains someDataObject ? true
...
At iteration 6216 the map still holds the reference on someDataObject
At iteration 6217 the map still holds the reference on someDataObject
At iteration 6218 the map still holds the reference on someDataObject
somDataObject has finally been garbage collected at iteration 6219, hence the map is now empty
Ответ 3
* будет ли запись удалена из файла WeakHashMap, будет ли размер карты равен нулю? *
Если emp
содержит последнее задание, делающее Employee сильно достижимым, то запись на карте может быть удалена.
Документы Java суммируют его довольно хорошо:
Реализация карты на основе хэш-таблицы со слабыми ключами. Запись в WeakHashMap будет автоматически удалена, если ее ключ больше не используется обычным образом. Точнее, наличие отображения для данного ключа не будет препятствовать тому, чтобы ключ был отброшен сборщиком мусора [...]. Когда ключ был отброшен, его запись эффективно удаляется с карты, поэтому этот класс ведет себя несколько иначе, чем другие реализации Map.
И будет ли это наоборот в случае HashMap?
Удаление записи из файла WeakHashMap не повлияет на другие ссылки в программе.
Ответ 4
Ссылка в java - это адрес памяти, где созданные объекты указывают в памяти. В WeakHashMap используется понятие "Слабая ссылка".
Как только вы создаете объект в java и присваиваете его некоторой переменной, он становится сильно доступным.
Слабый ссылочный объект может быть несколько похож на объект, который не имеет ссылок на память, т.е. теперь может быть собран мусор.
Ответ 5
В других реализациях карты, таких как HashMap, ключи могут быть доступны. Например, если у HashMap есть ключи как класс Person, как показано ниже, и если для объекта Person установлено значение null, даже после этого, если мы будем делать map.get(Person), мы получим значение из памяти, так как ключи сильно привязаны в HashMap.
wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Hash Map :" + wm.toString());
Выход: Хэш-карта: {[email protected]=John}
По сравнению с HashMap, WeakHashMap является тем, который удалит его enteries, как только ключи не будут иметь ссылки в памяти. Например, если у WeakHashMap есть ключи как класс Person, как показано ниже, и если для объекта Person установлено значение null, теперь, если вы выполните map.get(Person), мы получим null из него, потому что ключ не имеет ссылки (или, скорее, слабо достижимый).
wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Weak Hash Map :" + wm.toString());
Результат: слабая хэш-карта: {}
Ответ 6
Пример WeakHashMap:
Map map = new WeakHashMap();
Foo foo = new Foo();
map.put(foo, "bar");
foo=null; // strong refrence is removed and object is available for garbage collection.
Пример HashMap:
Map map = new HashMap();
Foo foo = new Foo();
map.put(foo, "bar");
foo=null; // even though the reference is nullified object will not garbage collected because map is having Strong refrence.