【问题标题】:RemoveEldestEntry in LinkedHashmap while trying to implement LRU algorithm in java尝试在 Java 中实现 LRU 算法时,LinkedHashmap 中的 RemoveEldestEntry
【发布时间】:2016-08-13 17:51:33
【问题描述】:

我有这段代码,我想了解它是如何工作的。

public class LRUAlgoCacheImpl<K,V> implements IAlgoCache<K,V>{

    private int capacity;

    private LinkedHashMap<K,V> lhm;
    public LRUAlgoCacheImpl(int capacity) {
        lhm = new LinkedHashMap<K,V>(capacity+1,1.1f, true) {
            protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                return lhm.size()> capacity;
            }
        };      
        this.capacity=capacity;
    }

我知道它会覆盖 LinkedHashMap 类中的 removeEldestEntry,但我不太明白如何。 我可以在我的类声明中扩展LinkedHashmap 而无需这样做,而只是进行常规覆盖,但我正在尝试了解更多信息。 有人可以向我解释一下吗? 提前谢谢你。

【问题讨论】:

    标签: java algorithm lru


    【解决方案1】:

    LRUAlgoCacheImpl 类通过应用composition 的OO 设计概念和扩展LinkedHashMapanonymous inner class 来实现LRU(最近最少使用)算法,以便覆盖removeEldestEntry(Map.Entry) 以便能够驱逐地图大小超过提供的容量时最旧的条目。

    为什么应用组合而不是继承?

    主要原因与在 Java 中您只能扩展一个类这一事实有关,例如,与 C++ 不同,因此如果您选择类 Inheritance,如果您需要使代码不断发展,您以后可能会遇到设计问题。另一方面,Composition 让您实现接口,这是一种很好的设计实践,因为您可以实现任意数量的接口,Composition 方法更加灵活,因此是可维护性的更好选择。

    【讨论】:

    • 嗨,谢谢你的评论。我还没有理解语法本身,我的意思是,在新对象声明期间,我打开括号并覆盖函数?这是什么意思?提前谢谢你
    • 它是一个匿名内部类,查看我的答案中的链接
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多