思路:
維護一個有序單鏈表,越靠近鏈表尾部的結點是越早之前訪問的。當有一個新的數據被訪問時,我們從鏈表頭開始順序遍歷鏈表。
- 如果此數據之前已經被緩存在鏈表中了,我們遍歷得到這個數據對應的結點,並將其從原來的位置刪除,然後再插入到鏈表的頭部。
- 如果此數據沒有在緩存鏈表中,又可以分爲兩種情況:如果此時緩存未滿,則將此結點直接插入到鏈表的頭部;如果此時緩存已滿,則鏈表尾結點刪除,將新的數據結點插入鏈表的頭部。
這裏可以用Java LinkedHashMap集合來實現
/**
* 寫字樓裏寫字間,寫字間里程序員
* 程序人員寫程序,又拿程序換酒錢
*/
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
private final int MAX_SIZE;
public LRUCache(int cacheSize){
// true 表示讓 linkedHashMap 按照訪問順序來進行排序,最近訪問的放在頭部,最老訪問的放在尾部。
super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
MAX_SIZE = cacheSize;
}
@Override
public boolean removeEldestEntry(Map.Entry<K,V> eldest){
return size() > MAX_SIZE;
}
}