WeakHashMap не является полезным в качестве кэша, по крайней мере, так, как большинство людей думают об этом. Как вы говорите, он использует слабые ключи , а не слабые значения , поэтому он не предназначен для того, для чего большинство людей хочет его использовать (и, на самом деле, у меня видел люди используют это, неправильно).
WeakHashMap в основном полезен для хранения метаданных об объектах, жизненный цикл которых вы не контролируете. Например, если у вас есть группа объектов, проходящих через ваш класс, и вы хотите отслеживать дополнительные данные о них без необходимости уведомления об их выходе из области видимости и без ссылки на них, чтобы они оставались в живых.
Простой пример (и тот, который я использовал ранее) может выглядеть примерно так:
WeakHashMap<Thread, SomeMetaData>
где вы можете отслеживать, что делают различные потоки в вашей системе; когда поток умирает, запись будет автоматически удалена с вашей карты, и вы не будете препятствовать сборке мусора, если будете последней ссылкой на нее. Затем вы можете перебрать записи в этой карте, чтобы узнать, какие у вас есть метаданные об активных потоках в вашей системе.
См. WeakHashMap в не кеш! для получения дополнительной информации.
Для того типа кэша, который вам нужен, используйте специальную систему кэширования (например, EHCache ) или посмотрите google-collection ' класс MapMaker ; что-то вроде
new MapMaker().weakValues().makeMap();
сделает то, что вам нужно, или, если вы хотите стать модным, вы можете добавить время истечения:
new MapMaker().weakValues().expiration(5, TimeUnit.MINUTES).makeMap();