上一篇 <<<JDK8的HashMap中紅黑樹左旋右旋原理圖解
下一篇 >>>HashSet集合底層實現(xiàn)原理
LRU(最近最少使用)緩存淘汰算法一般用于緩存場景,當緩存滿的時候,把最少使用的數(shù)據(jù)清掉。
方案1:當key使用的時候,count值+1,最后遍歷key的count值,把最小的key清理出去。缺點是數(shù)據(jù)量大時遍歷效率低
方案2:基于LinkedHashMap有序集合實現(xiàn)
原理:訪問key的時候,就會將該key存放到鏈表最后的位置,鏈表最開頭位置說明最近最少使用的
public class ManualLruAlgorithm<K, V> extends LinkedHashMap<K, V> {
/**
* 容量
*/
private int capacity;
public ManualLruAlgorithm(int capacity) {
// 末尾accessOrder設置為true,表示訪問順序,當有訪問時,key被挪到末尾,最前面是最少使用的數(shù)據(jù)
super(capacity, 0.75f, true);
this.capacity = capacity;
}
/**
* 列表大小大于容量時,清理頭結點
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
public static void main(String[] args) {
ManualLruAlgorithm<String, String> lruCache = new ManualLruAlgorithm<>(3);
lruCache.put("a","a");
lruCache.put("b","b");
lruCache.put("c","c");
lruCache.put("d","d");
// 打印結果:bcd,a已被淘汰
lruCache.forEach((k, v) -> {
System.out.print(k );
});
System.out.println();
lruCache.put("c","e");
// 打印結果:bdc,c已被挪到末尾
lruCache.forEach((k, v) -> {
System.out.print(k );
});
}
}
相關文章鏈接:
<<<Java集合類圖總覽
<<<ArrayList的添加和刪除操作實現(xiàn)原理圖解
<<<ArrayList的動態(tài)擴容、ModCount及fail-fast原理
<<<LinkedList增刪改查操作底層實現(xiàn)原理
<<<數(shù)組拷貝的幾種方式及和鏈表結構的對比
<<<Jdk1.7HashMap源碼分析
<<<Jdk1.7HashMap如何擴容及解決死循環(huán)問題
<<<JDK1.8HashMap源碼分析
<<<ConcurrentHashMap在JDK1.8版本比1.7改進了什么
<<<JDK8的HashMap中紅黑樹左旋右旋原理圖解
<<<HashSet集合底層實現(xiàn)原理
<<<HashTable底層實現(xiàn)原理及和ConcurrentHashMap區(qū)別
<<<java集合常見面試題