更新時間:2023-09-01 來源:黑馬程序員 瀏覽量:
在Java中實現(xiàn)一個LRU(Least Recently Used)緩存可以使用泛型來靈活支持不同類型的數(shù)據(jù)。LRU緩存基于最近訪問策略,當緩存達到一定大小時,會將最近最少使用的數(shù)據(jù)項從緩存中移除。
以下是一個使用泛型的簡單LRU緩存的實現(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) } }
接下來筆者逐步解釋上述代碼:
1.LRUCache類是泛型類,它接受兩個類型參數(shù)K和V,分別代表鍵和值的類型。
2.在構造函數(shù)中,我們傳入緩存的容量(最大允許存儲的鍵值對數(shù))。我們使用LinkedHashMap來實現(xiàn)緩存,因為它可以保持插入順序或訪問順序,我們選擇訪問順序以實現(xiàn)LRU策略。
3.在構造LinkedHashMap時,我們通過傳遞參數(shù)來設置accessOrder為true,這會將訪問過的元素移到鏈表尾部,以便我們能夠輕松找到最近使用的元素。
4.我們還覆蓋了removeEldestEntry方法,該方法會在添加新元素后被調用。我們在這里檢查緩存的大小是否超過容量,如果超過容量,則移除最老的元素。這個方法決定了何時移除最不常使用的元素。
5.get方法允許獲取緩存中的值,如果鍵不存在,則返回 null。
6.put方法用于向緩存中添加鍵值對。
7.display方法用于顯示緩存的內容,用于調試和測試。
8.在main方法中,我們演示了如何創(chuàng)建一個LRUCache實例,并使用它來添加、獲取和更新緩存中的元素。
以上示例演示了如何使用泛型編寫一個LRU緩存。我們可以根據(jù)自己的需求對其進行擴展和定制。