Manchmal geht es erstaunlich einfach und man muss nur wissen, wie. Jedenfalls freue ich mich über alles, was einfach und ohne Zusatzbibliothek einsatzfähig gemacht werden kann. So zum Beispiel einen LRU-Cache (least recently used). Den kann man gut benutzen, wenn man einen Cache braucht, der jedoch nicht uneingeschränkt wachsen darf. Dafür lässt sich eine
LinkedHashMap
verwenden, der eine Maximalgröße verpasst wird. Die Objekt-Instanzen in der
LinkedHashMap
rutschen mit jedem weiteren, hinzugefügten Eintrag weiter nach Hinten. Die im Beispiel implementierte Methode
removeEldestEntry
sorgt dann dafür, dass die letzten, und somit auch die ältesten Einträge, die über die Maximalgröße hinausreichen, weggeworfen werden. Einträge wiederum die via
get
angefordert wurden, wandern praktischer Weise auch gleich wieder nach vorne, was dazu führt, dass sie länger im Cache verbleiben.
Hier also die versprochene Klasse. An Einfachheit wirklich kaum zu übertreffen:
/**
* Provides support for a LRU (least recently used) cache.
* This cache is not thread safe and would need to wrap with Collections.synchronizedMap() if thread safety is needed.
*/
public class LRUCacheMap<K, V> extends LinkedHashMap<K, V>{
private final int maxSize;
/**
* @param maxSize maximum number of entries.
*/
public LRUCacheMap(final int maxSize) {
super(maxSize * 4 / 3, 0.75f, true);
this.maxSize = maxSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > maxSize;
}
}
via
Vanilla Java