【问题标题】:LRU best way to do a quick implementation in javaLRU 在java中快速实现的最佳方法
【发布时间】:2023-04-07 16:12:01
【问题描述】:

我想构建一个快速的 LRU 缓存。 这种解决方案是做到这一点的好方法吗? 那么同步呢?

有一个名为 removeEldestEntry 的受保护方法。将项目添加到地图时调用此方法。默认实现只返回 false。但我可以继承 LinkedHashMap 并重写此方法以检查是否已达到最大大小,然后返回 true。 LinkedHashMap 将通过链表找到最旧的条目并在添加新条目之前启动它。

public class MyLRUMap<K,V> extends LinkedHashMap<K,V> {
private int maxCapacity;

public MyLRUMap(int initialCapacity, float loadFactor, int maxCapacity) {
super(initialCapacity, loadFactor, true);
this.maxCapacity = maxCapacity;
}

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

谢谢

【问题讨论】:

    标签: java algorithm caching lru


    【解决方案1】:

    这是推荐的方法,尽管最好使用size() &gt; this.maxCapacity 而不是&gt;=

    【讨论】:

    • 是不是因为在插入新元素之后调用了 removeEldest 方法?如果我 >=,我的地图将保持 maxCapacity -1 作为其大小?
    • 正确,根据 Javadoc,removedEldest 在 put() 和 putAll() 之后调用
    【解决方案2】:

    我想为此推荐 guava/cachebuilder

    【讨论】:

      【解决方案3】:

      在“Java 泛型和集合”一书中提到了这个实现 here

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多