Java實(shí)現(xiàn)LRU緩存算法的參考示例
一、什么是 LRU
LRU(Least Recently Used,最近最少使用)是一種緩存算法,其核心思想是將最近最少使用的緩存項(xiàng)移除,以便為更常用的緩存項(xiàng)騰出空間。
在實(shí)際應(yīng)用中,LRU 算法被廣泛用于緩存和頁(yè)面置換。
二、Java 實(shí)現(xiàn) LRU 緩存算法
在 Java 中,可以使用 LinkedHashMap 來(lái)實(shí)現(xiàn) LRU 緩存算法。
LinkedHashMap 是 HashMap 的一個(gè)子類,其內(nèi)部使用雙向鏈表維護(hù)元素的順序。
具體實(shí)現(xiàn)思路如下:
- 繼承 LinkedHashMap,重寫(xiě) removeEldestEntry 方法,該方法返回 true 表示需要移除最老的緩存項(xiàng);
- 在構(gòu)造方法中指定 accessOrder 為 true,這樣在訪問(wèn)元素時(shí)就會(huì)把該元素移動(dòng)到鏈表尾部,方便后續(xù)查找和移除;
- 在訪問(wèn)緩存項(xiàng)時(shí),使用 get 方法獲取元素,并通過(guò) removeEldestEntry 方法來(lái)判斷是否需要移除最老的緩存項(xiàng);
- 在添加緩存項(xiàng)時(shí),使用 put 方法將元素加入 LinkedHashMap 中。
使用 LinkedHashMap 實(shí)現(xiàn) LRU 緩存算法的示例代碼如下:
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
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) {
LRUCache<Integer, String> cache = new LRUCache<>(3);
cache.put(1, "one");
cache.put(2, "two");
cache.put(3, "three");
System.out.println(cache); // {1=one, 2=two, 3=three}
cache.get(2);
System.out.println(cache); // {1=one, 3=three, 2=two}
cache.put(4, "four");
System.out.println(cache); // {3=three, 2=two, 4=four}
}
}
在上面的示例代碼中,我們創(chuàng)建了一個(gè) LRUCache 類,繼承了 LinkedHashMap,并在構(gòu)造方法中指定了 accessOrder 為 true。
在 removeEldestEntry 方法中,當(dāng)緩存項(xiàng)數(shù)量超過(guò)容量時(shí)返回 true,表示需要移除最老的緩存項(xiàng)。
在訪問(wèn)緩存項(xiàng)時(shí),使用 get 方法獲取元素,如果緩存項(xiàng)數(shù)量超過(guò)容量,則會(huì)移除最老的緩存項(xiàng)。
在添加緩存項(xiàng)時(shí),使用 put 方法將元素加入 LinkedHashMap 中。
最后,在 main 方法中對(duì)緩存進(jìn)行測(cè)試。
需要注意的是,在使用 LinkedHashMap 實(shí)現(xiàn) LRU 緩存時(shí),必須指定 accessOrder 為 true,否則 LinkedHashMap 會(huì)按照插入順序維護(hù)元素的順序,而不是訪問(wèn)順序。
到此這篇關(guān)于Java實(shí)現(xiàn)LRU緩存算法的參考示例的文章就介紹到這了,更多相關(guān)Java LRU緩存算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法
這篇文章主要介紹了啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法,也就是使用默認(rèn)用戶和密碼登錄的操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
SpringBoot項(xiàng)目找不到j(luò)avax.servlet.Filter的問(wèn)題及解決
這篇文章主要介紹了SpringBoot項(xiàng)目找不到j(luò)avax.servlet.Filter的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
java通過(guò)jni調(diào)用opencv處理圖像的方法
今天小編就為大家分享一篇java通過(guò)jni調(diào)用opencv處理圖像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Java基礎(chǔ)鞏固小項(xiàng)目點(diǎn)菜系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了一個(gè)Java小項(xiàng)目點(diǎn)菜系統(tǒng)的實(shí)現(xiàn),主要是用的集合,適合正在學(xué)習(xí)Java的朋友拿來(lái)實(shí)戰(zhàn)練手,感興趣的朋友快來(lái)看看吧2022-03-03

