LRU 實現 通過 LinkedHashMap
1 通過 LinkedHashMap
LinkedHashMap自身已經實現了順序儲存,預設情況下是按照元素的新增順序儲存,也可以啟用按照訪問順序儲存,即最近讀取的資料放在最前面,最早讀取的資料放在最後面,然後它還有一個判斷是否刪除最老資料的方法,預設是返回false,即不刪除資料,我們使用LinkedHashMap實現LRU快取的方法就是對LinkedHashMap實現簡單的擴充套件,
public class LURCache<K,V> extends LinkedHashMap<K,V> {
private int size;
private LURCache(int size) {
//當引數accessOrder為true時,即會按照訪問順序排序,最近訪問的放在最前,最早訪問的放在後面
super(size, 0.75f, true);
this.size = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > size;
}
public static <K, V> LURCache<K, V> newInstance(int size) {
return new LURCache<>(size);
}
}
2 通過 linklist 實現
put 插入時候 如果沒有則插入到頭部,如果有則移動此條資料到頭部。
如果超過了 cache容量 就刪除 最後的記錄。
get 操作 如果有則返回,並將此條資料移動到頭部
public class LinkListCache<V> {
private int size;
public LinkedList<V> linkedList;
public V get(V v){
int index = linkedList.indexOf(v);
if(index == -1){
//addToHead(v);
return null;
}
moveToHead(index);
return v;
}
public V put(V v){
int index = linkedList.indexOf(v);
if(index == -1){
linkedList.addFirst(v);
addToHead(v);
}
else{
moveToHead(index);
}
return v;
}
private void moveToHead(int index){
V v = linkedList.remove(index);
linkedList.addFirst(v);
}
private void addToHead(V e){
linkedList.addFirst(e);
if(linkedList.size() >= size){
linkedList.removeLast();
}
}
public void show(){
linkedList.forEach(t->{
System.out.println(t);
});
}
public LinkListCache(int size) {
this.size = size;
this.linkedList = new LinkedList<>();
}
public static <V> LinkListCache< V> newInstance(int size) {
return new LinkListCache<>(size);
}
public static void main(String[] args) {
LinkListCache<String> cache = LinkListCache.newInstance(5);
cache.put("hello");
cache.put("world");
cache.put("river");
cache.put("crazzy");
cache.put("frank");
cache.put("lucy");
cache.show();
System.out.println(" ================= ");
cache.get("river");
cache.show();
}
}
相關文章
- 通過分析LinkedHashMap瞭解LRUHashMap
- 面試官:如何用LinkedHashMap實現LRU面試HashMap
- 使用LinkedHashMap來實現一個使用LRU(Least Recently Used)演算法的cacheHashMapAST演算法
- LRU原理與實現
- LinkedHashMap的實現講解HashMap
- 通過佇列實現棧OR通過棧實現佇列佇列
- 通過原始碼學習@functools.lru_cache原始碼
- LRU快取實現(Java)快取Java
- 通過模板實現POI
- LRU cache原理及go實現Go
- 通過redis實現session共享RedisSession
- C# 通過socket實現UDP 通訊C#UDP
- LRU cache快取簡單實現快取
- 動手實現一個 LRU cache
- 用 Go 實現一個 LRU cacheGo
- 用go 簡單實現的LRUGo
- 通過 App Groups 實現程式間通訊APP
- LRU Cache 的簡單 C++ 實現C++
- Laravel 通過 Macros 實現列印原生 MySQLLaravelMacROSMySql
- 通過socket實現DUP程式設計程式設計
- 通過佇列實現批量處理佇列
- 如果通過流資料實現實時分析?
- 深入淺出 Map 的實現(HashMap、HashTable、LinkedHashMap、TreeMap)HashMap
- JS 實現快取演算法(FIFO/LRU)JS快取演算法
- LRU Cache的原理和python的實現Python
- 利用LRU策略實現Axios請求快取iOS快取
- Java的通過管道來實現執行緒通訊Java執行緒
- Extjs 通過 Ext.Direct 實現與 Laravel 通訊JSLaravel
- Swoole 中通過 process 模組實現多程式
- 通過Spring Boot Webflux實現Reactor KafkaSpring BootWebUXReactKafka
- 通過Go實現AES加密和解密工具Go加密解密
- Spring中通過Annotation來實現AOPSpring
- 通過API介面實現圖片上傳API
- Android通過WindowManager實現懸浮框Android
- Spring Boot 通過CORS實現跨域Spring BootCORS跨域
- Android 通過JNI實現守護程式Android
- 自定義通過PopupWindow實現通用選單
- .NET通過async/await實現並行AI並行