【问题标题】:Question about LRU Cache implementation in Java关于Java中LRU Cache实现的问题
【发布时间】:2009-08-04 20:31:11
【问题描述】:

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

在下面的代码 sn-p 中添加一个新条目后,默认情况下如何调用 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);

【问题讨论】:

  • 感谢您的回答!所以这是匿名内部类,我错过了。

标签: java caching lru


【解决方案1】:

根据Java API for LinkedHashMap

removeEldestEntry(Map.Entry) 方法可能会被覆盖,以便在将新映射添加到映射时自动删除陈旧映射的策略。

具体来说:

在向映射中插入新条目后,putputAll 调用此方法。

另请注意:

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

【讨论】:

  • 它会被执行,但它不会做任何事情;您需要按照我在回答中的描述扩展 LinkedHashMap。
  • 问题:“removeEldestEntry 默认如何调用...”
【解决方案2】:

在本例中,LinkedHashMap 被扩展为 "anonymous inner class"

removeEldestEntry 方法覆盖了超类的版本,它总是返回false(表示不应该删除最旧的条目)。如果映射的大小超过限制,则覆盖版本返回true,表示应删除最旧的条目。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      相关资源
      最近更新 更多