Wird ein WeakHashMap-Eintrag gesammelt, wenn der Wert den einzigen starken Verweis auf den Schlüssel enthält?

8

Ich muss einige Daten für die Lebensdauer mit einem Schlüssel verknüpfen, daher verwende ich WeakHashMap . Zusätzlich muss ich einen Schlüssel durch den entsprechenden Wert erhalten. Der einfachste Weg ist, die Referenz beizubehalten, wenn Sie einen Wert erstellen:

%Vor%

Natürlich, während ich Value in meinem Programm verwende, wird seine key nicht verschwinden. Wenn es jedoch keine Referenzen mehr auf einen Schlüssel oder seinen Wert außerhalb der Karte gibt, wird er dann als Müll gesammelt? Oder verhindert die überlebende starke Referenz im Wert das?

    
Alexey Romanov 08.11.2011, 14:28
quelle

2 Antworten

13

Nein, es wird kein Müll gesammelt, siehe Javadoc :

  

Implementierungshinweis: Die Wertobjekte in einer WeakHashMap werden von gewöhnlichen starken Referenzen gehalten. Daher sollte darauf geachtet werden, dass Wertobjekte sich nicht direkt oder indirekt stark auf ihre eigenen Schlüssel beziehen, da dies verhindert, dass die Schlüssel verworfen werden.

Wie von @biziclop erwähnt, wäre eine Lösung, eine schwache Referenz auf den Schlüssel in Ihrem Wertobjekt zu speichern.

%Vor%     
laguille 08.11.2011, 14:43
quelle
2

Wenn man die Implementierung betrachtet, scheint die Antwort nein zu sein.

Dies ist von der WeakHashMap Quelle:

%Vor%

Wie Sie sehen können, werden Entry Objekte stark von der Karte selbst referenziert. Also, wenn die Karte zugänglich ist, so wird die Entry , also Ihre Value -Objekte, und Ihr Schlüssel auch.

    
biziclop 08.11.2011 14:43
quelle