一、目的
通过LinkedHashMap
实现LRU.
二、概念
LRU
- Least Recently Used
的缩写,即最近最少使用.
三、核心
利用linkedHashMap
的removeEldestEntry()
以及accessOrder
属性.
removeEldestEntry()
: 重新此方法,当条件满足为true
时,删除当前map
中最老的键值。
accessOrder
:
true的时候,将按照操作后的元素放在链表后面放置顺序就是访问顺序.
false的时候,将按照插入顺序来遍历.
四、具体实现
LRU实现类
public class LruTest<K, V> {
private LinkedHashMap<K, V> lruMap;
private float loadFactory = 0.75f;
LruTest(int cap) {
ConditionUtils.notNullWithFormat(cap, InCommonErrorCodeConstants.PARAM_IS_EMPTY, "cap");
lruMap = new LinkedHashMap<K, V>(cap, loadFactory, true) {
/**
* put的时候,将移除map中最老的键和值
*/
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return super.size() > cap;
}
};
}
LruTest put(K key, V value) {
lruMap.put(key, value);
return this;
}
V get(K key){
return lruMap.get(key);
}
Map<K,V> getMap(){
return Safes.of(lruMap);
}
}
测试方法:
public static void main(String[] args) {
LruTest<String, String> lruTest = new LruTest<>(3);
lruTest.put("1","1");
lruTest.put("2","2");
lruTest.put("3","3");
lruTest.put("4","4");
System.out.println("测试直接添加的场景,删除第一个节点 : " + JsonMoreUtils.toJson(lruTest.getMap()));
lruTest.put("2","new2");
lruTest.put("2","new22");
lruTest.put("3","new3");
lruTest.put("5","5");
System.out.println("测试直接编辑后的场景,删除未使用的key - 【 4 】 : " + JsonMoreUtils.toJson(lruTest.getMap()));
lruTest.get("5");
lruTest.get("2");
lruTest.put("6","6");
System.out.println("测试访问的场景,删除未访问的key - 【 3 】 : " + JsonMoreUtils.toJson(lruTest.getMap()));
}
结果:
测试直接添加的场景,删除第一个节点 : {"2":"2","3":"3","4":"4"}
测试直接编辑后的场景,删除未使用的key - 【 4 】 : {"2":"new22","3":"new3","5":"5"}
测试访问的场景,删除未访问的key - 【 3 】 : {"5":"5","2":"new22","6":"6"}