2013-10-14 8 views
9

Czy HashSet<WeakReference<T>> jest odpowiednikiem Set odpowiednikiem WeakHashMap<T>? To znaczy, czy wpisy zostaną automatycznie usunięte , gdy nie będą już przywoływane?Ustaw odpowiednik WeakHashMap?

Jeśli nie, jaki jest równoważny?

+0

Uwierz w to, czego możesz potrzebować: http://stackoverflow.com/a/4062950/717932 – dardo

+0

możliwy duplikat [Dlaczego istnieje WeakHashMap, ale nieobecny WeakSet?] (Http://stackoverflow.com/ pytania/4062919/why-does-exist-weakhashmap-but-absent-weakset) –

+1

To pytanie nie jest duplikatem. Drugie pytanie próbuje odpowiedzieć, dlaczego nie ma WeakSet. Nie zapewnia odpowiednika zestawu, ani nie odpowiada, czy mój przykład powyżej jest liczony jako odpowiednik. –

Odpowiedz

13

Nie, jeśli obiekt odwołuje jednego z WeakReference s w zestawie dostaje śmieci-pobierana, WeakReference nadal będzie w komplecie i nie zostaną usunięte automatycznie, ale ich referent będzie null. A WeakHashMap używa dodatkowego kodu do usunięcia słabo odwołanych kluczy z mapy, gdy są zbierane śmieci.

Zestaw równoważnik WeakHashMap jest:

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

Jako HashSet wykorzystuje również HashMap wewnętrznie.

BTW: A WeakReference to tylko obiekt wskazujący na obiekt, który może być gromadzony podczas zbierania śmieci, pomimo odniesienia do niego zawartego przez WeakReference. Sam plik WeakReference nie będzie zbierany w pamięci śmieci, dopóki nie będzie już nigdzie mocno przywoływany, podobnie jak wszystkie inne obiekty.

+0

Oto odpowiedź, której szukałem. Dziękuję Ci! –