蒟蒻のJAVA小窩(LinkedHashMap相關)

一些文章的小總結:
1.LinkeHashMap在每次插入、刪除後,都會調用一個函數來進行 雙向鏈表的維護 ,準確的來說,是有三個函數來做這件事,這三個函數都統稱爲 回調函數 ,這三個函數分別是:

void afterNodeAccess(Node<K,V> p) { }
其作用就是在訪問元素之後,將該元素放到雙向鏈表的尾巴處
void afterNodeRemoval(Node<K,V> p) { }
其作用就是在刪除元素之後,將元素從雙向鏈表中刪除,
void afterNodeInsertion(boolean evict) { }
在插入新元素之後,需要回調函數判斷是否需要移除一直不用的某些元素!
再介紹一下 LinkedHashMap 的構造函數…

其主要是兩個構造方法,一個是繼承 HashMap ,一個是可以選擇 accessOrder 的值 (默認 false,代表按照插入順序排序) 來確定是按插入順序還是讀取順序排序。

/**
 * //調用父類HashMap的構造方法。
 * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
 * with the default initial capacity (16) and load factor (0.75).
 */
public LinkedHashMap() {
    super();
    accessOrder = false;
}
// 這裏的 accessOrder 默認是爲false,如果要按讀取順序排序需要將其設爲 true
// initialCapacity 代表 map 的 容量,loadFactor 代表加載因子 (默認即可)
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
    }
    LRU緩存算法實現
頁置換算法,最近最少使用算法:當緩存達到容量的時候,總是置換出最近一段時間內最長時間未被使用的元素。
繼承LinkedHashMap,並重寫removeEldestEntry函數,即可很輕鬆的實現這個功能。

```cppimport java.util.LinkedHashMap;
class LRUCache extends LinkedHashMap<Integer,Integer> {

    private int limit;

    public LRUCache(int capacity) {
        super(capacity,0.75f,true);
        limit = capacity;
    }
    
    public int get(int key) {
    	// 這裏選用getOrDefault函數而不選用get函數,是題目要求返回-1,而不是返回空
        return super.getOrDefault(key,-1);
    }
    
    public void put(int key, int value) {
        super.put(key,value);
    }

    @Override
    public boolean removeEldestEntry(Map.Entry<Integer,Integer> eldest) {
        return size() > limit;
    }
    }

怎麼兩塊代碼連一起了。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章