Слабые хеш-карты Java

Слабые хеш-карты JavaКласс WeakHashMap был спроектирован для решения одной интересной проблемы. Что случится со значением, чей ключ более не используется нигде в вашей прогармме? Предположим, что последняя ссылка на ключ исчезла. Значит, не остается никакого способа сослаться на объект-значение. Но поскольку ни одна часть программы не содержит обращений к данному ключу, то и соответствующая пара «ключ/значение» не может быть удалена из карты.

Почему бы сборщику мусора не удалить ее? Разве это не его работа — удалять неиспользуемые объекты? К сожалению, все не так просто. Сборщик мусора отслеживает живые объекты. До тех пор, пока объект карты жив, все группы в нем живы и не могут быть освобождены. Поэтому ваша программа должна позаботиться об удалении неиспользуемых значений из долгоживущих карт. Или же вы должны вместо этого использовать WeakHashMap. Эта структура данных сотрудничает со сборщиком мусора для удаления пар «ключ/значение», когда единственной ссылкой на ключ остается ссылка из вхождения данной карты.

Поясним, как работает этот механизм. WeakHashMap использует слабые ссылки для хранения ключей. Объект WeakHashMap содержит ссылку на другой объект, в нашем случае — ключ хещ-таблицы. Объекты этого типа трактуются сборщиком мусора специальным образом. Обычно если сборщик мусора обнаруживает, что определенный объект не имеет ссылок на него, он просто освобождает память, занятую им.

Однако если объект доступен только из WeakHashMap, сборщик мусора также освобождает его, но помещает слабую ссылку на его в очередь. Операция WeakHashMap периодически проверяют эту очередь на предмет появления новых слабых ссылок. Появление такой ссылки в очереди говорит о том, что ключ более не используется никем, и что он должен быть удален. Тогда WeakHashMap удаляет ассоциированное вхождение.