Ich bin nicht gewöhnt, mit weichen und schwachen Referenzen in Java umzugehen, aber ich verstehe das Prinzip, da ich mit Datagrids wie Gemfire umgehen kann, die einen Überlauf zu HDD Features bieten Speicher ist voll, wahrscheinlich mit weichen Referenzen oder etwas ähnliches, denke ich.Guava CacheBuilder oder MapMaker mit schwachem/weichem Verbrauch
Was ich in Guava nicht verstehe, ist, dass es Methoden zur Verfügung stellt, um die Schlüssel weich/schwach und die Werte weich/schwach zu machen.
Ich frage mich nur, was ist der Punkt der Erstellung von Softkeys mit nicht-weichen Werten für Beispiel? Ich meine, wenn die Soft-Referenzen gesammelt werden, können wir den Eintrag nicht mehr mit seinem Schlüssel finden. Warum sollten wir also die Werte auf der Karte behalten?
Kann jemand gibt uns einige usecases mit:
- Schwachen Schlüssel/Soft-Wert
- Schwachen Schlüssel/Normalwert
- Softkey/schwachen Wert
- Softkey/Normalwert
Dank
bearbeiten Ich bin nicht sicher, ob meine Frage präzise genug so, was ich wissen möchte:
- , wenn eine Taste (schwach/weich) gesammelt wird, was dem Wert passiert, (nicht schwach/weich)
- Wenn ein Wert erfasst wird (schwach/weich), was passiert mit dem Schlüssel
- Werden Einträge mit einem fehlenden Teil (Schlüssel oder Wert) im Cache gespeichert?
- Und gibt es einen Anwendungsfall, wenn solche Einträge im Cache bleiben sollen.
Edit: Wie auf Kevin Bourillon Antwort diskutiert, schließlich ich glaube, ich verstehe, warum Softkeys hat nichts zu bedeuten. Hier ist der Grund:
TESTING WEAK KEYS
strongRefKey = strongRef
noStrongRefKey = null
keyset = [KeyHolder{key='toto'}]
TESTING SOFT KEYS
strongRefKey = strongRef
noStrongRefKey = null
keyset = [KeyHolder{key='tata'}, KeyHolder{key='toto'}]
TESTING SOFT REFERENCES
toto == toto -> true
equals keys? true
equals ref? false
Wie Sie sehen können, mit der (veraltet) Softkeys Karte, die KEYHOLDER mit "tata" noch existieren in der Karte:
static class KeyHolder {
final private String key;
public KeyHolder(String key) {
this.key = key;
}
public String getKey() {
return key;
}
@Override
public boolean equals(Object o) {
KeyHolder that = (KeyHolder)o;
boolean equality = this.getKey().equals(that.getKey());
return equality;
}
@Override
public int hashCode() {
return key != null ? key.hashCode() : 0;
}
@Override
public String toString() {
return "KeyHolder{" +
"key='" + key + '\'' +
'}';
}
}
public static void main(String[] args) {
System.out.println("TESTING WEAK KEYS");
testMap(new MapMaker().weakKeys().<KeyHolder,String>makeMap());
System.out.println("\n\n");
System.out.println("TESTING SOFT KEYS");
testMap(new MapMaker().softKeys().<KeyHolder, String>makeMap());
System.out.println("\n\n");
System.out.println("TESTING SOFT REFERENCES");
KeyHolder key1 = new KeyHolder("toto");
KeyHolder key2 = new KeyHolder("toto");
SoftReference<KeyHolder> softRef1 = new SoftReference<KeyHolder>(key1);
SoftReference<KeyHolder> softRef2 = new SoftReference<KeyHolder>(key2);
System.out.println("equals keys? " + key1.equals(key2));
System.out.println("equals ref? " + softRef1.equals(softRef2));
}
private static void testMap(Map<KeyHolder,String> map) {
KeyHolder strongRefKey = new KeyHolder("toto");
KeyHolder noStrongRefKey = new KeyHolder("tata");
map.put(strongRefKey,"strongRef");
map.put(noStrongRefKey,"noStrongRefKey");
// we replace the strong reference by another key instance which is equals
// this could happen for exemple in case of serialization/deserialization of the key
noStrongRefKey = new KeyHolder("tata");
System.gc();
System.out.println("strongRefKey = " + map.get(strongRefKey));
System.out.println("noStrongRefKey = " + map.get(noStrongRefKey));
System.out.println("keyset = " + map.keySet());
}
Dieser Code die Ausgabe erzeugt. Beachten Sie jedoch, dass ich meinen Eintrag mit einem neu erstellten Schlüssel "new KeyHolder("tata");
" immer noch nicht finden kann. Das liegt daran, dass meine Schlüssel sinngemäß gleich sind, aber die Referenzwrapper um sie herum nicht gleich sind, da ihre equals-Methode nicht überschrieben wird in Guava! In diesem Fall, ja, SoftKeys bedeutet nichts, da Sie unbedingt eine Identitätsverweis auf diesen Schlüssel halten müssen, um es abrufen zu können.
Wenn Sie also Softvalues verwenden und die meisten Werte gesammelt werden, haben Sie immer noch einen Cache mit vielen Einträgen, vielen Schlüsseln, aber keinen Wert? –
Wenn Sie also schwache Schlüssel verwenden und die Schlüssel nicht mehr außerhalb des Caches stehen, werden die Schlüssel gesammelt, aber was passiert mit den Werten? Werden sie im Cache aufbewahrt? –
Wenn du sagst, dass SoftKeys keinen Sinn ergeben, bin ich mir nicht sicher. Was ist, wenn Sie die Möglichkeit haben, einen neuen Schlüssel zu rekonstruieren: Sie möchten vielleicht, dass die Schlüssel im Cache bleiben, auch wenn Sie keine Identitätsreferenz haben, da Sie den entsprechenden Schlüssel NEIN erneut erstellen können? Was ist mit dem Schlüssel, der geklont/serialisiert/deserialisiert wird? Siehst du, was ich meine? –