Java LRUCache,为什么我们需要另一个集合

标签 java caching

我正在阅读这篇文章来了解 Java 中的 LRUCache - Java LRU cache using LinkedList

这篇文章中有一个解决方案:

public class LRUCache {

    private Map<Integer, Integer> blocks = new HashMap<Integer, Integer>();
    private LinkedList<Integer> bru = new LinkedList<Integer>();
    private int capacity;
    private int length;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.length = 0;
    }

    public int get(int key) {
        Integer value = blocks.get(key);
        if (value != null) {
            bru.remove(value);
            bru.addFirst(value);
            return value;
        }
        return -1;
    }

    public void set(int key, int value) {
        if (blocks.containsKey(key)) {
            bru.remove(blocks.get(key));
            blocks.put(key, value);
        } else {
            if (length >= capacity) {
                blocks.remove(bru.removeLast());
                length--;
            }

            length++;
            blocks.put(key, value);
        }
        bru.addFirst(value);
    }
}

在此程序中,blocks 映射是保存所需值的实际映射。那么为什么我们需要另一个集合 bru LinkedList 呢?

最佳答案

Map<Integer, Integer> blocks是保存所需值的实际值,

同时LinkedList<Integer> bru用于存储最近访问值。

关于Java LRUCache,为什么我们需要另一个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51325289/

相关文章:

Java generics - Map of (typed) maps

spring-boot - springboot2.0中使用@cacheable时如何为每个redis缓存配置不同的ttl

java - 随后的 Socket 连接到网页需要不同的时间

java - 在 Java 或 Groovy 中,如何找到 byte[] 的文件类型?

java - 使用换行正则表达式仅拆分字符串整数

java - 我需要消除简单的 Selenium 代码中的错误 "java.util.ConcurrentModificationException"

java - Zimbra SOAP API - java?

caching - Drupal 8 cookie 缓存问题

java - 如何避免 Spring 缓存中区分大小写的键?

java - XStream Java显示进度