Является ли HashSet<WeakReference<T>>
Set
эквивалентом WeakHashMap<T>
? То есть будут ли записи автоматически удаляться, когда на них больше не ссылаются?
Если нет, то какой эквивалент?
Является ли HashSet<WeakReference<T>>
Set
эквивалентом WeakHashMap<T>
? То есть будут ли записи автоматически удаляться, когда на них больше не ссылаются?
Если нет, то какой эквивалент?
Нет, если объект, на который ссылается один из WeakReference
в наборе, удаляется сборщиком мусора, WeakReference
все равно будет включен в набор и не будет удален автоматически, но их referent
будет null
. WeakHashMap
использует дополнительный код для удаления ключей со слабыми ссылками с карты, когда они удаляются сборщиком мусора.
Установленный эквивалент WeakHashMap
:
Set<T> set = Collections.newSetFromMap(new WeakHashMap<T, Boolean>());
Поскольку HashSet
также использует HashMap
внутри.
Кстати: WeakReference
— это просто объект, указывающий на объект, который может быть удален сборщиком мусора, несмотря на то, что ссылка содержится в WeakReference
. Сам WeakReference
не будет подвергаться сборке мусора до тех пор, пока на него больше не будет строго ссылаться, как и на все другие объекты.