Ich weiß das mit einem WeakReference
, wenn ich WeakReference
zu etwas mache, das, wenn nicht direkt darauf Bezug genommen wird, Garbage Collection mit dem nächsten GC-Zyklus ist. Meine Frage wird, was ist, wenn ich ein ArrayList
von WeakReference
s mache?
Zum Beispiel:
%Vor% Ich kann jetzt mit exArrayList.get(0).get()
auf die Daten zugreifen.
Meine Frage wird: Dies ist WeakReference
data, werden die Daten in exArrayList.get(0)
mit dem nächsten GC-Zyklus verglichen? (selbst wenn ich keinen weiteren direkten Hinweis darauf gebe) oder wird diese spezielle Referenz solange bestehen bleiben, bis die arraylist
geleert ist? (zB: exArrayList.clear();
).
Wenn dies ein Duplikat ist, habe ich es nicht mit meinen Keywords in Google gefunden.
exArrayList.add(new WeakReference<String>("Hello"));
ist ein schlechtes Beispiel, weil String
Literale niemals GC-eds sind
wenn es z.B. exArrayList.add(new WeakReference<Object>(new Object()));
, nach einem GC wäre das Objekt GC-ed, aber exArrayList.get(0)
würde immer noch WeakReference
zurückgeben, obwohl exArrayList.get(0).get()
null
Die Daten in exArrayList.get(0)
sind WeakReference
. Es ist nicht an sich eine schwache Referenz, also wird es nicht gesammelt ...
ABER das Objekt, auf das von exArrayList.get(0)
verwiesen wird, ist schwach referenziert, daher kann zu jeder Zeit gecacht werden (das erfordert natürlich, dass es keine starken Verweise darauf gibt dieses Objekt).
Also
data.get(0)
wird nicht null
, aber data.get(0).get()
wird möglicherweise.
Mit anderen Worten, die Liste verweist nicht auf das schwach referenzierte Objekt, sondern auf die schwache Referenz selbst.
Das ist eine schlechte Idee wie die anderen oben erklärten Poster (Referenzobjekte nicht frei). Verwenden Sie eine WeakHashMap mit den Objekten als Schlüssel und einigen Dummy-Werten ("" oder Boolean.TRUE oder ähnlich).
Tags und Links java android garbage-collection arraylist weak-references