java写一个LRUCache吧?
1 个回答
有些东西不需要答案,态度就是答案。贝儿好的,下面是带有中文注释的 `LRUCache` 实现: ### LRUCache.java ```java import java.util.LinkedHashMap; import java.util.Map; /** * LRUCache 是一个基于 LinkedHashMap 实现的简单的最近最少使用 (Least Recently Used) 缓存。 * * @param <K> 缓存中键的类型 * @param <V> 缓存中值的类型 */ public class LRUCache<K, V> extends LinkedHashMap<K, V> { // 缓存的最大容量 private final int capacity; /** * 构造具有指定容量的 LRUCache。 * * @param capacity 缓存中能容纳的最大条目数 */ public LRUCache(int capacity) { // 第三个参数 true 表示按访问顺序排序 super(capacity, 0.75f, true); this.capacity = capacity; } /** * 如果此映射应删除其最老的条目,则返回 true。 * 每次添加新条目时,通过 put 和 putAll 调用此方法。 * 它提供了机会在每次添加新条目时移除最老的条目。 * * @param eldest 映射中最老的条目,如果这是一个访问顺序的映射,则是最少访问的条目 * @return 如果应该移除最老的条目,则返回 true,否则返回 false */ @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > capacity; } /** * 获取缓存中的值。如果键存在,则更新键的访问顺序。 * * @param key 要获取的键 * @return 如果键存在,则返回对应的值,否则返回 null */ @Override public V get(Object key) { return super.get(key); } /** * 将一个键值对放入缓存中。如果键已存在,则更新键的访问顺序。 * * @param key 要放入的键 * @param value 要放入的值 * @return 返回之前与键关联的值,如果没有则返回 null */ @Override public V put(K key, V value) { return super.put(key, value); } public static void main(String[] args) { LRUCache<Integer, String> cache = new LRUCache<>(3); cache.put(1, "one"); cache.put(2, "two"); cache.put(3, "three"); System.out.println(cache); // 输出: {1=one, 2=two, 3=three} cache.get(1); cache.put(4, "four"); System.out.println(cache); // 输出: {3=three, 1=one, 4=four} cache.put(5, "five"); System.out.println(cache); // 输出: {1=one, 4=four, 5=five} } ``` ### 解释 1. **构造函数**:`LRUCache(int capacity)` 构造函数初始化缓存容量,并设置 `LinkedHashMap` 为按访问顺序排序。 2. **`removeEldestEntry` 方法**:此方法决定是否在添加新条目后移除最老的条目。当缓存中的条目数超过设定的容量时,返回 `true`,以移除最老的条目。 3. **`get` 方法**:重写 `get` 方法,获取缓存中的值并更新访问顺序。 4. **`put` 方法**:重写 `put` 方法,将键值对放入缓存中,并更新访问顺序。 通过运行 `main` 方法,可以测试 LRU 缓存的工作情况。编辑于 2024-06-07 09:09 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

