Frage zur LRU Cache-Implementierung in Java
Frage
Das Standardbeispiel für die Implementierung LRU Cache in Java verweist auf das Beispiel Depot url http://www.exampledepot.com/egs/java.util/coll_Cache. html
Wie wird removeEldestEntry standardmäßig aufgerufen, nachdem gerade unter einen neuen Eintrag in dem Code-Snippet hinzufügen?
final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
// This method is called just after a new entry has been added
public boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
// Add to cache
Object key = "key";
cache.put(key, object);
// Get object
Object o = cache.get(key);
if (o == null && !cache.containsKey(key)) {
// Object not in cache. If null is not a possible value in the cache,
// the call to cache.contains(key) is not needed
}
// If the cache is to be used by multiple threads,
// the cache must be wrapped with code to synchronize the methods
cache = (Map)Collections.synchronizedMap(cache);
Lösung
In diesem Beispiel wird die LinkedHashMap
mit einem .
Die removeEldestEntry
Methode überschreibt die Super-Klasse-Version, die immer false
zurückgibt (der älteste Eintrag angibt, sollte nicht entfernt werden). Die übergeordnete Version kehrt true
, wenn die Größe der Karte den Grenzwert überschreitet, was anzeigt, dass der älteste Eintrag entfernt werden soll.
Andere Tipps
Per Java API für LinkedHashMap
:
Die
removeEldestEntry(Map.Entry)
Verfahren können eine Richtlinie zum Entfernen von veralteten Zuordnungen automatisch zu verhängen außer Kraft gesetzt werden, wenn neue Zuordnungen zu der Karte hinzugefügt werden.
Im Einzelnen:
Diese Methode wird aufgerufen, durch
put
undputAll
nach einem neuen Eintrag in die Karte eingefügt wird.
Beachten Sie auch:
Dieses Verfahren typischerweise nicht die Karte in irgendeiner Weise ändern, anstatt die Karte ermöglicht, sich zu ändern, wie durch den Rückgabewert gerichtet. Es ist für diese Methode erlaubt die Karte direkt zu ändern, aber wenn es so tut, muss es false zurück (was anzeigt, dass die Karte keine weitere Modifikation versuchen sollte). Die Auswirkungen der Rückkehr wahr, nachdem die Karte aus diesem Verfahren modifiziert sind nicht spezifiziert.
Die LinkedHashMap Klasse Dokumentation besagt, dass es die Methode removeEldestEntry () zu geeigneten Zeiten nennen. In dem obigen Code stellen wir ein anonymes „erweitert“ der LinkedHashMap Klasse, die unsere Implementierung explizit für diese Methode zur Verfügung stellt.