WeakHashMap может вести себя так, как будто неизвестный поток молча удаляет записи.
WeakHashMap.Entry
- это объект WeakReference
, референтом которого является объект key
, который вы передали map.put()
. То есть, если key
становится weakly reachable
, сборщик мусора автоматически объявит его завершаемым.
В документе Java SE 8 написано , что :
Объект является слабо достижимым, если он не является ни сильно, ни мягко достижимым, но может быть достигнут, пройдя слабую ссылку. Когда слабые ссылки на слабодоступный объект очищаются, объект становится пригодным для завершения.
В этой строке вашего кода
Integer obj = new Integer(200);
map.put(obj, "sgdjsgd");
* obj
являетсясильная ссылка на целочисленный объект, созданный new Integer(200)
, и затем он передается в map.put()
, который создает WeakReference
(при условии, что он называется w
) для хранения этого целочисленного объекта.
Но после этой строки:
obj = new Integer(20);
obj
указывает на другой целочисленный объект , который содержит 20 (w
все еще указывает на целочисленный объект, который содержит 200). Но при изменении объекта, на который указывает obj
, референт из w
становится weakly reachable
, потому что он может быть достигнут только при обходе слабой ссылки (а именно w
).
Когда элемент управления возвращаетсяот вызова метода до System.gc()
JVM сделала все возможное, чтобы утилизировать все отброшенные объекты. Таким образом, как сказано выше, сборщик мусора будет атомарно объявлять слабо достижимые объекты финализуемыми и, наконец, очищать их.
Таким образом, w
очищается, запись на карте отбрасывается сборщиком мусора и какрезультат, ваша карта ничего не содержит.