编写一个Java程序,要求实现一个“LRU(最近最少使用)缓存”机制。

问题:

编写一个Java程序,要求实现一个“LRU(最近最少使用)缓存”机制。

要求:

  • 设计一个LRU缓存,缓存中最多存储​​capacity​​个元素。
  • 提供​​get(int key)​​和​​put(int key, int value)​​方法:
  • ​get(key)​​:如果缓存中存在该key,返回它的值。如果不存在,返回-1。
  • ​put(key, value)​​:将元素(key, value)添加到缓存中。如果缓存已满,删除最少使用的元素。
  • 每次访问缓存(通过​​get​​或​​put​​),都应使得该元素成为最近使用的元素。

提示:

  • 使用​​LinkedHashMap​​可以帮助你更容易地实现这个缓存系统。
#java
代码
CodePulse代码脉搏
2025-05-01 22:55:57
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Jimaks
Jimaks

基于​​LinkedHashMap​​实现的高效LRU缓存方案,满足O(1)时间复杂度要求:

import java.util.LinkedHashMap;
import java.util.Map;

class LRUCache {
    private final LinkedHashMap<Integer, Integer> cache;
    private final int capacity;

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

    public int get(int key) {
        return cache.getOrDefault(key, -1);
    }

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

实现原理

  1. 数据结构选择
  • ​LinkedHashMap​​内部维护双向链表,通过构造函数第三个参数​​accessOrder=true​​启用访问顺序模式
  • 每次​​get/put​​操作都会将被访问条目移动到链表尾部
  1. 容量控制
  • 重写​​removeEldestEntry​​方法,当缓存大小超过容量时自动删除链表头部的最近最少使用条目
  1. 时间复杂度
  • ​get​​和​​put​​操作的时间复杂度均为O(1)
  • 自动维护访问顺序无需额外操作

使用示例

public static void main(String[] args) {
    LRUCache cache = new LRUCache(2);
    cache.put(1, 1);
    cache.put(2, 2);
    System.out.println(cache.get(1));     // 返回 1
    cache.put(3, 3);                      // 挤掉 key=2
    System.out.println(cache.get(2));     // 返回 -1
    cache.put(4, 4);                      // 挤掉 key=1
    System.out.println(cache.get(1));     // 返回 -1
}

替代方案(手动实现双向链表+哈希表)

// 完整实现见:https://leetcode.com/problems/lru-cache/solutions/45911/java-hashtable-double-linked-list-solution-with-o-1
// 优点:更直观展示LRU机制底层原理
// 缺点:代码复杂度较高,实际开发推荐使用LinkedHashMap方案

两种方案对比:

特性

LinkedHashMap方案

手动实现方案

代码复杂度

简单(10行)

复杂(80+行)

时间复杂度

O(1)

O(1)

空间复杂度

O(n)

O(n)

可扩展性

中等


适合场景

通用需求

需要定制化LRU逻辑

分享
微博
QQ
微信https://www.51cto.com/aigc/
回复
2025-05-06 08:40:59
发布
相关问题
如何实现高效的缓存策略?
271浏览 • 1回复 待解决
提问