lru linkedHashMap

本文深入探讨了LRU(Least Recently Used)策略在Java中如何通过LinkedHashMap实现。我们将会学习如何使用put、get和peek操作,并理解它们在缓存淘汰策略中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

put/get/peek


public class Lrup {
    //FiFO结构:容量capital和链表linkedHashMap,参数内部使用不用加private
    int capital;
    LinkedHashMap<Integer,Integer> cache;
    //只需要容量参数
    public Lrup(int capital) {
        this.cache=new LinkedHashMap<>();
        this.capital = capital;
    }
    //主要是put和get的两个方法,peek获取栈顶不改变链表顺序
    public void put(int key,int value){
        //hashMap对重复key的去重处理,先去重FO
        if (cache.containsKey(key)) {
            cache.remove(key);
        }
        //加上capital2,FO执行,123传入,去掉1,剩23
        //当capital=2,cache.size=2, 迭代器获取next第一个数据,remove掉
        if (cache.size()==capital) {
            //获取First
            Iterator<Integer> iterator = cache.keySet().iterator();
            cache.remove(iterator.next());
        }
        //最后put
        cache.put(key,value);
    }
    public int get(int key){
        //不包含的key返回-1
        if (!cache.containsKey(key)) {
            return -1;
        }
        Integer value = cache.get(key);
        //由于LRU是最新的缓存,在get之后。获取的数据也应该存在链表的末尾
        //把get的数据存在链表的结尾
        cache.remove(key);
        cache.put(key,value);
        return value;
    }
    public int peek() {
       return cache.get(cache.entrySet().iterator().next().getKey());
    }
}
class Run{
    public static void main(String[] args) {
        Lrup lrup = new Lrup(2);
        lrup.put(1,1);
        lrup.put(2,2);
        lrup.put(3,3);
        System.out.println("lrup.get(2) = " + lrup.get(2));
        System.out.println("lrup.get(1) = " + lrup.get(1));
        LinkedHashMap<Integer, Integer> cache = lrup.cache;
        for (Map.Entry<Integer, Integer> integerIntegerEntry : cache.entrySet()) {
            System.out.println(integerIntegerEntry);
        }
        System.out.println("lrup.peek() = " + lrup.peek());
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值