Java 彻底手撕LRU设计(使用JDK容器与不使用JDK容器)
JDK 1.8
本文讲述了两种利用JDK容器实现LRU的方法,以及最后不使用JDK容器,自己定义HashMap和链表来纯手工打造时间复杂度为O(1)的LRU算法。
§ 使用JDK容器
1、使用LinkedHashMap
这种方式比较简单,注释都在代码里
public class LRUCache<K,V>{
// 使用泛型
private LinkedHashMap<K, V> cache;
private int capacity; // 容量
public LRUCache(int capacity) {
cache = new LinkedHashMap<>();
this.capacity = capacity;
}
public V get(K key) {
if (cache.containsKey(key)) {
V val = cache.get(key);
cache.remove(key); // 删除key
cache.put(key, val); // 重新put,实现了生命周期的更新
return val;
} else {
return null;
}
}
public void put(K key, V val) {
if (cache.containsKey(key)) {
cache.remove(key);
} else if (cache.size() >= capacity) {
Iterator itr = cache.keySet().iterator();
cache.remove(itr.next()); // 删除头
}
cache.put(key, val);
}
}
2、使用HashMap + LinkedList
- HashMap存储K-V元素
- LinkedList按序存储key
import java.util.HashMap;
import java.util.LinkedList;
/**
* @description:
* @Author: JachinDo
* @Date: 2020/04/24 22:04
*/
public class LRUCache2<K, V> {
private HashMap<K, V> map;
private LinkedList<K> list;
private int capacity;
public LRUCache2(int capacity) {
map = new HashMap<>();
list = new LinkedList<K>();
this.capacity = capacity;
}
public V get(K key) {
if (map.containsKey(key)) {
V val = map.get(key);
list.remove(key); // 更新<