android - java - WeakReferenzen mit einer ArrayList?

8

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.

    
codingNewb 21.03.2014, 09:52
quelle

3 Antworten

19
  1. exArrayList.add(new WeakReference<String>("Hello")); ist ein schlechtes Beispiel, weil String Literale niemals GC-eds sind

  2. 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

  3. zurückgeben würde
Evgeniy Dorofeev 21.03.2014, 09:58
quelle
6

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.

    
SJuan76 21.03.2014 09:58
quelle
0

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).

    
Stefan Reich 22.03.2017 20:15
quelle