数据结构:自己实现一个LRU的缓存(初始化传入缓存最大容量)
程序员文章站
2024-02-27 15:54:03
...
最近爱上了刷力扣,越刷越上瘾!然后今天有道题是让自己实现一个【LRUCache】,也就是LRU缓存。LRU缓存呢,就是当容量不够的时候就要淘汰掉最近最少使用的缓存值,也就是【Least Recently Used】,这也就是LRU缓存名字的由来。至于为什么容量不够的时候要优先淘汰掉最近最少使用的缓存值呢?这个就涉及到计算机科学里面大名鼎鼎的【局部性原理】了!
我在力扣上面提交的题也不少了,这道题还是比较有意思的(这道题的力扣网址),我也是直接借用了JDK的LinkedHashMap来实现的,这里直接上代码:
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Leetcode Website: https://leetcode-cn.com/problems/lru-cache-lcci/
* @author : LiYang
* @datetime : 2021/7/7 22:35
*/
public class LRUCache {
/**
* 存缓存值的Map
*/
private Map<Integer, Integer> cache;
/**
* 缓存容量
*/
private int capacity;
/**
* 构造方法,传入容量
* @param capacity 缓存容量
*/
public LRUCache(int capacity) {
// 初始化缓存容量
this.capacity = capacity;
// 将村缓存的Map初始化为LinkedHashMap
cache = new LinkedHashMap<>(capacity);
}
/**
* 获取缓存值
* @param key 缓存键
* @return 值
*/
public int get(int key) {
// 先从缓存中删除,并拿到值
Integer value = cache.remove(key);
// 如果有值
if (value != null) {
// 重新添加到末尾
cache.put(key, value);
// 返回该缓存值
return value;
} else {
// 没有值,返回-1
return -1;
}
}
/**
* 添加缓存值
* @param key 键
* @param value 值
*/
public void put(int key, int value) {
// 先删除原值
cache.remove(key);
// 添加新值到末尾
cache.put(key, value);
// 如果超了容量,则删除至最大容量
while (cache.size() > capacity) {
cache.remove(cache.keySet().iterator().next());
}
}
}
上一篇: 程序员代码面试指南之单调栈结构
下一篇: 二进制中有多少个1