Установить эквивалент WeakHashMap?

Является ли HashSet<WeakReference<T>> Set эквивалентом WeakHashMap<T>? То есть будут ли записи автоматически удаляться, когда на них больше не ссылаются?

Если нет, то какой эквивалент?


person Barry Fruitman    schedule 14.10.2013    source источник
comment
Поверьте, это то, что вы ищете: stackoverflow.com/a/4062950/717932   -  person dardo    schedule 14.10.2013
comment
возможный дубликат Почему существует WeakHashMap, но отсутствует WeakSet?   -  person Oliver Charlesworth    schedule 14.10.2013
comment
Этот вопрос не является дубликатом. Другой вопрос пытается ответить, почему нет WeakSet. Он не предоставляет эквивалент Set и не отвечает, считается ли мой пример выше эквивалентом.   -  person Barry Fruitman    schedule 15.10.2013


Ответы (1)


Нет, если объект, на который ссылается один из WeakReference в наборе, удаляется сборщиком мусора, WeakReference все равно будет включен в набор и не будет удален автоматически, но их referent будет null. WeakHashMap использует дополнительный код для удаления ключей со слабыми ссылками с карты, когда они удаляются сборщиком мусора.

Установленный эквивалент WeakHashMap:

Set<T> set = Collections.newSetFromMap(new WeakHashMap<T, Boolean>()); 

Поскольку HashSet также использует HashMap внутри.

Кстати: WeakReference — это просто объект, указывающий на объект, который может быть удален сборщиком мусора, несмотря на то, что ссылка содержится в WeakReference. Сам WeakReference не будет подвергаться сборке мусора до тех пор, пока на него больше не будет строго ссылаться, как и на все другие объекты.

person Njol    schedule 15.10.2013
comment
Это ответ, который я искал. Спасибо! - person Barry Fruitman; 16.10.2013