Die Java-Bibliotheksdokumentation für das java.lang.refPaket kennzeichnet die abnehmende Stärke der drei expliziten Referenztypen.
Sie verwenden a, SoftReferencewenn das referenzierte Objekt so lange am Leben bleiben soll, bis der Host-Prozess fast keinen Speicher mehr hat. Das Objekt kann erst gesammelt werden, wenn der Kollektor Speicher freigeben muss . Locker gesagt, ein SoftReferenceMittel binden , "Pin das Objekt, bis Sie nicht mehr können."
Verwenden WeakReferenceSie im Gegensatz dazu a, wenn Sie die Lebensdauer des referenzierten Objekts nicht beeinflussen möchten. Sie möchten lediglich eine separate Aussage über das referenzierte Objekt machen, solange es am Leben bleibt. Die Berechtigung des Objekts zur Sammlung wird nicht durch das Vorhandensein gebundener WeakReferences beeinflusst. So etwas wie eine externe Zuordnung von der Objektinstanz zu einer verwandten Eigenschaft, bei der die Eigenschaft nur aufgezeichnet werden muss, solange das verwandte Objekt lebt, ist eine gute Verwendung für WeakReferences und WeakHashMap.
Der letzte PhantomReferenceist schwerer zu charakterisieren. Eine WeakReferencesolche Bindung hat PhantomReferencekeinen Einfluss auf die Lebensdauer des referenzierten Objekts. Aber im Gegensatz zu den anderen Referenztypen kann man a nicht einmal dereferenzieren PhantomReference. In gewissem Sinne zeigt es nicht auf das, worauf es zeigt, soweit Anrufer dies beurteilen können. Es ermöglicht lediglich das Verknüpfen einiger verwandter Daten mit dem referenzierten Objekt - Daten, die später überprüft und bearbeitet werden können, wenn das Objekt PhantomReferencein der zugehörigen Warteschlange in die Warteschlange gestellt wird ReferenceQueue. Normalerweise leitet man einen Typ von PhantomReferencediesem abgeleiteten Typ ab und enthält einige zusätzliche Daten. Leider ist ein Downcasting erforderlich, um einen solchen abgeleiteten Typ zu verwenden.
In Ihrem Beispielcode kann nicht die refReferenz (oder, wenn Sie es vorziehen, "Variable") null sein. Es ist vielmehr der Wert, der durch Aufrufen erhalten wird Reference#get(), der null sein kann. Wenn sich herausstellt, dass es null ist, sind Sie zu spät. Das referenzierte Objekt ist bereits auf dem Weg, gesammelt zu werden:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMapaber keineSoftHashMapoderPhantomHashMapausgezeichnete Frage, warum habe ich das vorher nicht bemerkt .. ??