首頁常見問題正文

Java中如何利用泛型寫一個(gè)LRU緩存?

更新時(shí)間:2023-09-01 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在Java中實(shí)現(xiàn)一個(gè)LRU(Least Recently Used)緩存可以使用泛型來靈活支持不同類型的數(shù)據(jù)。LRU緩存基于最近訪問策略,當(dāng)緩存達(dá)到一定大小時(shí),會將最近最少使用的數(shù)據(jù)項(xiàng)從緩存中移除。

  以下是一個(gè)使用泛型的簡單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)
    }
}

  接下來筆者逐步解釋上述代碼:

  1.LRUCache類是泛型類,它接受兩個(gè)類型參數(shù)K和V,分別代表鍵和值的類型。

  2.在構(gòu)造函數(shù)中,我們傳入緩存的容量(最大允許存儲的鍵值對數(shù))。我們使用LinkedHashMap來實(shí)現(xiàn)緩存,因?yàn)樗梢员3植迦腠樞蚧蛟L問順序,我們選擇訪問順序以實(shí)現(xiàn)LRU策略。

1693532049630_Java中如何利用泛型寫一個(gè)LRU緩存.jpg

  3.在構(gòu)造LinkedHashMap時(shí),我們通過傳遞參數(shù)來設(shè)置accessOrder為true,這會將訪問過的元素移到鏈表尾部,以便我們能夠輕松找到最近使用的元素。

  4.我們還覆蓋了removeEldestEntry方法,該方法會在添加新元素后被調(diào)用。我們在這里檢查緩存的大小是否超過容量,如果超過容量,則移除最老的元素。這個(gè)方法決定了何時(shí)移除最不常使用的元素。

  5.get方法允許獲取緩存中的值,如果鍵不存在,則返回 null。

  6.put方法用于向緩存中添加鍵值對。

  7.display方法用于顯示緩存的內(nèi)容,用于調(diào)試和測試。

  8.在main方法中,我們演示了如何創(chuàng)建一個(gè)LRUCache實(shí)例,并使用它來添加、獲取和更新緩存中的元素。

  以上示例演示了如何使用泛型編寫一個(gè)LRU緩存。我們可以根據(jù)自己的需求對其進(jìn)行擴(kuò)展和定制。

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!