关于Java中LRU Cache实现的问题

时间:2009-08-04 20:31:11

标签: java caching lru

在Java中实现LRU Cache的标准示例指向示例库depl http://www.exampledepot.com/egs/java.util/coll_Cache.html

在下面的代码片段中添加新条目后,默认情况下如何调用removeEldestEntry?

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);

3 个答案:

答案 0 :(得分:2)

根据Java API for LinkedHashMap

  

可以重写removeEldestEntry(Map.Entry)方法,以便在将新映射添加到地图时自动删除过时映射的策略。

具体做法是:

  

在将新条目插入地图后,putputAll会调用此方法。

另请注意:

  

此方法通常不会以任何方式修改地图,而是允许地图按其返回值的指示修改自身。此方法允许直接修改映射,但如果它这样做,则必须返回false(表示映射不应尝试进一步修改)。从此方法中修改映射后返回true的效果未指定。

答案 1 :(得分:1)

在此示例中,LinkedHashMap正在使用"anonymous inner class"进行扩展。

removeEldestEntry方法覆盖超类的版本,该版本始终返回false(表示不应删除最旧的条目)。如果地图的大小超过限制,则覆盖版本将返回true,表示应删除最旧的条目。

答案 2 :(得分:0)

LinkedHashMap类文档声明它将在适当的时候调用方法removeEldestEntry()。在上面的代码中,我们提供了LinkedHashMap类的匿名“扩展”,它明确地为该方法提供了我们的实现。