Java实现一个LRU Cache本地缓存

前两天网易面试被问到的问题, 当时我根本不知道什么是LRU…很尴尬

LRU Cache = Least Recently Uesd Cache

就是: 最近 最少使用的缓存;

当时在面试官的提示下我第一个想到的是HashMap, 要做线程安全可以用ConcurrentHashMap
然后面试官提示缓存不能无限大, 所以我限定了HashMap的容量, 但是因为不理解LRU的概念, 所以答得很惨烈…

这个题目很典型, 出自Leetcode: 146. LRU缓存机制 题目链接

题目描述如下:
在这里插入图片描述

这一题我的第一反应是, LRU可能应该用一个HashMap配合一个Queue来做, 因为它要做一个类似于先进先出的模式呀, 最早使用的在前面, 要先出去, 但是很容易要出现的情况是, 一个原本在队列中间的元素, 现在要使用了, 就很难从队列里取出来;

所以这题的正解是 使用HashMap加链表来做, 在HashMap里, 存一个key-value的结构, 然后value里面就存链表每个节点的引用, 限定Map和链表的长度, 保证不会超过Capacity;

在这里插入图片描述
图解如上;

实现代码如下:

public class LRUCache {
    private Map<Integer, Integer> cache;

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

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

    public void put(int key, int value) {
        cache.put(key, value);
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值