更新時(shí)間:2023-09-01 來(lái)源:黑馬程序員 瀏覽量:
在Java中實(shí)現(xiàn)一個(gè)LRU(Least Recently Used)緩存可以使用泛型來(lái)靈活支持不同類型的數(shù)據(jù)。LRU緩存基于最近訪問(wèn)策略,當(dāng)緩存達(dá)到一定大小時(shí),會(huì)將最近最少使用的數(shù)據(jù)項(xiàng)從緩存中移除。
以下是一個(gè)使用泛型的簡(jiǎn)單LRU緩存的實(shí)現(xiàn)示例,我將逐步解釋其核心部分。
import java.util.*; public class LRUCache<K, V> { private final int capacity; private final LinkedHashMap<K, V> cache; public LRUCache(int capacity) { this.capacity = capacity; this.cache = new LinkedHashMap<>(capacity, 0.75f, true) { @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > capacity; } }; } public V get(K key) { return cache.getOrDefault(key, null); } public void put(K key, V value) { cache.put(key, value); } public void display() { for (Map.Entry<K, V> entry : cache.entrySet()) { System.out.print("(" + entry.getKey() + ":" + entry.getValue() + ") "); } System.out.println(); } public static void main(String[] args) { LRUCache<String, Integer> cache = new LRUCache<>(3); cache.put("one", 1); cache.put("two", 2); cache.put("three", 3); System.out.println("Initial Cache:"); cache.display(); // Output: (one:1) (two:2) (three:3) cache.get("one"); // Access "one" to make it most recently used. System.out.println("Cache after accessing 'one':"); cache.display(); // Output: (two:2) (three:3) (one:1) cache.put("four", 4); // Adding a new item, which should remove the least recently used item ("two"). System.out.println("Cache after adding 'four':"); cache.display(); // Output: (three:3) (one:1) (four:4) } }
接下來(lái)筆者逐步解釋上述代碼:
1.LRUCache類是泛型類,它接受兩個(gè)類型參數(shù)K和V,分別代表鍵和值的類型。
2.在構(gòu)造函數(shù)中,我們傳入緩存的容量(最大允許存儲(chǔ)的鍵值對(duì)數(shù))。我們使用LinkedHashMap來(lái)實(shí)現(xiàn)緩存,因?yàn)樗梢员3植迦腠樞蚧蛟L問(wèn)順序,我們選擇訪問(wèn)順序以實(shí)現(xiàn)LRU策略。
3.在構(gòu)造LinkedHashMap時(shí),我們通過(guò)傳遞參數(shù)來(lái)設(shè)置accessOrder為true,這會(huì)將訪問(wèn)過(guò)的元素移到鏈表尾部,以便我們能夠輕松找到最近使用的元素。
4.我們還覆蓋了removeEldestEntry方法,該方法會(huì)在添加新元素后被調(diào)用。我們?cè)谶@里檢查緩存的大小是否超過(guò)容量,如果超過(guò)容量,則移除最老的元素。這個(gè)方法決定了何時(shí)移除最不常使用的元素。
5.get方法允許獲取緩存中的值,如果鍵不存在,則返回 null。
6.put方法用于向緩存中添加鍵值對(duì)。
7.display方法用于顯示緩存的內(nèi)容,用于調(diào)試和測(cè)試。
8.在main方法中,我們演示了如何創(chuàng)建一個(gè)LRUCache實(shí)例,并使用它來(lái)添加、獲取和更新緩存中的元素。
以上示例演示了如何使用泛型編寫一個(gè)LRU緩存。我們可以根據(jù)自己的需求對(duì)其進(jìn)行擴(kuò)展和定制。