首页常见问题正文

Java中如何利用泛型写一个LRU缓存?

更新时间:2023-09-01 来源:黑马程序员 浏览量:

IT培训班

  在Java中实现一个LRU(Least Recently Used)缓存可以使用泛型来灵活支持不同类型的数据。LRU缓存基于最近访问策略,当缓存达到一定大小时,会将最近最少使用的数据项从缓存中移除。

  以下是一个使用泛型的简单LRU缓存的实现示例,我将逐步解释其核心部分。

import java.util.*;

public class LRUCache<K, V> {
    private final int capacity;
    private final LinkedHashMap<K, V> cache;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.cache = new LinkedHashMap<>(capacity, 0.75f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                return size() > capacity;
            }
        };
    }

    public V get(K key) {
        return cache.getOrDefault(key, null);
    }

    public void put(K key, V value) {
        cache.put(key, value);
    }

    public void display() {
        for (Map.Entry<K, V> entry : cache.entrySet()) {
            System.out.print("(" + entry.getKey() + ":" + entry.getValue() + ") ");
        }
        System.out.println();
    }

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

        System.out.println("Initial Cache:");
        cache.display(); // Output: (one:1) (two:2) (three:3)

        cache.get("one"); // Access "one" to make it most recently used.

        System.out.println("Cache after accessing 'one':");
        cache.display(); // Output: (two:2) (three:3) (one:1)

        cache.put("four", 4); // Adding a new item, which should remove the least recently used item ("two").

        System.out.println("Cache after adding 'four':");
        cache.display(); // Output: (three:3) (one:1) (four:4)
    }
}

  接下来笔者逐步解释上述代码:

  1.LRUCache类是泛型类,它接受两个类型参数K和V,分别代表键和值的类型。

  2.在构造函数中,我们传入缓存的容量(最大允许存储的键值对数)。我们使用LinkedHashMap来实现缓存,因为它可以保持插入顺序或访问顺序,我们选择访问顺序以实现LRU策略。

1693532049630_Java中如何利用泛型写一个LRU缓存.jpg

  3.在构造LinkedHashMap时,我们通过传递参数来设置accessOrder为true,这会将访问过的元素移到链表尾部,以便我们能够轻松找到最近使用的元素。

  4.我们还覆盖了removeEldestEntry方法,该方法会在添加新元素后被调用。我们在这里检查缓存的大小是否超过容量,如果超过容量,则移除最老的元素。这个方法决定了何时移除最不常使用的元素。

  5.get方法允许获取缓存中的值,如果键不存在,则返回 null。

  6.put方法用于向缓存中添加键值对。

  7.display方法用于显示缓存的内容,用于调试和测试。

  8.在main方法中,我们演示了如何创建一个LRUCache实例,并使用它来添加、获取和更新缓存中的元素。

  以上示例演示了如何使用泛型编写一个LRU缓存。我们可以根据自己的需求对其进行扩展和定制。

分享到:
在线咨询 我要报名
和我们在线交谈!