一、目的
通過(guò)LinkedHashMap
實(shí)現(xiàn)LRU.
二吨凑、概念
LRU
- Least Recently Used
的縮寫(xiě)喘帚,即最近最少使用.
三、核心
利用linkedHashMap
的removeEldestEntry()
以及accessOrder
屬性.
removeEldestEntry()
: 重新此方法反粥,當(dāng)條件滿足為true
時(shí),刪除當(dāng)前map
中最老的鍵值卢肃。
accessOrder
:
true的時(shí)候,將按照操作后的元素放在鏈表后面放置順序就是訪問(wèn)順序.
false的時(shí)候,將按照插入順序來(lái)遍歷.
四疲迂、具體實(shí)現(xiàn)
LRU實(shí)現(xiàn)類
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的時(shí)候,將移除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);
}
}
測(cè)試方法:
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("測(cè)試直接添加的場(chǎng)景,刪除第一個(gè)節(jié)點(diǎn) : " + JsonMoreUtils.toJson(lruTest.getMap()));
lruTest.put("2","new2");
lruTest.put("2","new22");
lruTest.put("3","new3");
lruTest.put("5","5");
System.out.println("測(cè)試直接編輯后的場(chǎng)景,刪除未使用的key - 【 4 】 : " + JsonMoreUtils.toJson(lruTest.getMap()));
lruTest.get("5");
lruTest.get("2");
lruTest.put("6","6");
System.out.println("測(cè)試訪問(wèn)的場(chǎng)景,刪除未訪問(wèn)的key - 【 3 】 : " + JsonMoreUtils.toJson(lruTest.getMap()));
}
結(jié)果:
測(cè)試直接添加的場(chǎng)景,刪除第一個(gè)節(jié)點(diǎn) : {"2":"2","3":"3","4":"4"}
測(cè)試直接編輯后的場(chǎng)景莫湘,刪除未使用的key - 【 4 】 : {"2":"new22","3":"new3","5":"5"}
測(cè)試訪問(wèn)的場(chǎng)景,刪除未訪問(wèn)的key - 【 3 】 : {"5":"5","2":"new22","6":"6"}