2009-11-06 9 views
2

Existe-t-il des implémentations d'une table de hachage de taille statique qui limite les entrées aux métadonnées les plus récentes ou les plus fréquemment utilisées? Je préférerais ne pas suivre cette information moi-même.Métadonnées fréquemment utilisées Hashmap

Je sais que la plupart des composants de cache gardent une trace de cela, mais je préfèrerais ne pas introduire beaucoup de nouvelles dépendances.

Répondre

10

Vous pouvez construire un cache LRU en utilisant la bibliothèque JDK standard en utilisant LinkedHashMap:

public class MyLRUCache<K, V> extends LinkedHashMap<K, V> { 

    private final int maxEntries; 

    public MyLRUCache(int maxEntries) { 
     // you can be a bit fancy with capacity and load factor 
     super(16, 0.75, true); 
     this.maxEntries = maxEntries; 
    } 

    @Override 
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { 
     return size() > maxEntries; 
    } 
} 

Vous voudrez peut-être jouer avec WeakReference s ainsi.

+1

J'aime ça. Je n'en ai jamais entendu parler auparavant. – monksy

+0

Souhait Je savais à propos de WeakReferences avant. Cela rendrait ce mécanisme de cache un peu plus impressionnant quand je travaillais dessus. – monksy

2

Utilisez LinkedHashMap et passer outre removeEldestEntry et assurez-vous d'utiliser le constructor qui permet de accessOrder as true

Accessordered fait la carte supprimer l'élément le moins récemment accédé à la place de l'aîné.

Toutes les requêtes vont modifier la structure de la carte, donc être un peu plus lent.

Exemple:

public AccesOrderedLRUCache<V,K> extends LinkedHashMap<V,K>{ 
    private final m_capacity; 

    public AccesOrderedLRUCache(int capacity) { 
     super(0.75*capacity, 0.75, true); 
     m_capacity = capacity; 
    } 

    @Override 
    protected boolean removeEldestEntry (Map.Entry<K,V> eldest) { 
     return size() > getCapacity(); 
    } 

    public int getCapacity() { 
     return m_capacity; 
    } 
} 
+0

pas en jdk 1.6.0_13. http://kickjava.com/src/java/util/LinkedHashMap.java.htm (je ne sais pas quelle version c'est, mais toujours non) – Fedearne

+0

@Fedearne, merci. J'ai confondu l'accès-commandé par insertion-commandé – notnoop

+0

0,75 * la capacité n'est probablement pas ce que vous entendez ici. En supposant que vous voulez vraiment dire capacité/0,75? De même, getCapacity manque un parent et je préférerais renvoyer m_capacity à LRUCache.this.cacheSize dans removeEldestEntry(). –