java - 使用LinkedHashMap实现LRU缓存

标签 java insert linkedhashmap lru

我试图使用 LinkedHashMap 实现 LRU 缓存。 在 LinkedHashMap ( http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html ) 的文档中,它说:

请注意,如果将键重新插入到 map 中,插入顺序不会受到影响。

但是当我执行以下操作时

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private int size;

    public static void main(String[] args) {
        LRUCache<Integer, Integer> cache = LRUCache.newInstance(2);
        cache.put(1, 1);
        cache.put(2, 2);
        cache.put(1, 1);
        cache.put(3, 3);

        System.out.println(cache);
    }

    private LRUCache(int size) {
        super(size, 0.75f, true);
        this.size = size;
    }

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

    public static <K, V> LRUCache<K, V> newInstance(int size) {
        return new LRUCache<K, V>(size);
    }

}

输出是

{1=1, 3=3}

这表明重新插入确实影响了订单。 有人知道解释吗?

最佳答案

As pointed out by Jeffrey ,您正在使用 accessOrder。创建 LinkedHashMap 时,第三个参数指定如何更改顺序。

"true for access-order, false for insertion-order"

LRU更详细的实现可以看这个 http://www.programcreek.com/2013/03/leetcode-lru-cache-java/

关于java - 使用LinkedHashMap实现LRU缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475797/

相关文章:

java - 为什么我不能通过从另一个类调用方法来使用 JavaFX 文本字段生成 map ?

caching - LRU 和 LFU 有什么区别

Java原子lazySet

java - 是否可以在桌面应用程序中使用 Java WebSocket?

arrays - MongoDB。属性名称中缺少 ]

SQL Access INSERT INTO 失败

flutter - 限制Map中MapEntries的数量: Dart

Java - 为什么具有匹配签名的 SAM 类型不可互换?

JavaFX 在 Controller 内切换自身的可见性

r - 无法将 R 数据框追加到现有 Excel 中而不覆盖