Stavo cercando di implementare una cache LRU usando LinkedHashMap. Nella documentazione di LinkedHashMap (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html), si dice:Usa LinkedHashMap per implementare la cache LRU
Nota che l'ordine di inserimento non è interessato se un tasto viene nuovamente inserito nella mappa.
Ma quando faccio le seguenti mette
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private int size;
public static void main(String[] args) {
LRUCache<Integer, Integer> cache = LRUCache.newInstance(2);
cache.put(1, 1);
cache.put(2, 2);
cache.put(1, 1);
cache.put(3, 3);
System.out.println(cache);
}
private LRUCache(int size) {
super(size, 0.75f, true);
this.size = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > size;
}
public static <K, V> LRUCache<K, V> newInstance(int size) {
return new LRUCache<K, V>(size);
}
}
L'uscita è
{1=1, 3=3}
che indica che la ri-inserito ha influenzato l'ordine. Qualcuno conosce qualche spiegazione?
Mi chiedo, lo stai facendo per uno scopo specifico? Perché Java fornisce già un 'WeakHashMap' che fornisce questa funzionalità. https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html – Jack
Se l'ordine non sarà interessato dal reinserimento. L'ordine dovrebbe essere {2 = 2, 3 = 3}, poiché {1 = 1} viene aggiunto per primo e reinserito. –
@Jack 'WeakHashMap' non fa quello che tu [pensi di fare] (https://stackoverflow.com/questions/5511279/what-is-a-weakhashmap-and-when-to-use-it). Non è la stessa cosa di una [cache LRU] (https://en.wikipedia.org/wiki/Cache_algorithms#Examples). – Jeffrey