一些文章的小總結:
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;
}
}
怎麼兩塊代碼連一起了。。。