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演算法
- 通過佇列實現棧OR通過棧實現佇列佇列
- 通過原始碼學習@functools.lru_cache原始碼
- 通過模板實現POI
- 快取 LRU 和 LFU 實現快取
- LRU cache原理及go實現Go
- 通過redis實現session共享RedisSession
- 通過 App Groups 實現程式間通訊APP
- 動手實現一個 LRU cache
- LRU cache快取簡單實現快取
- 用 Go 實現一個 LRU cacheGo
- LRU Cache的原理和python的實現Python
- 利用LRU策略實現Axios請求快取iOS快取
- Spring中通過Annotation來實現AOPSpring
- Laravel 通過 Macros 實現列印原生 MySQLLaravelMacROSMySql
- Spring Boot 通過CORS實現跨域Spring BootCORS跨域
- 通過Spring Boot Webflux實現Reactor KafkaSpring BootWebUXReactKafka
- Android通過WindowManager實現懸浮框Android
- 如果通過流資料實現實時分析?
- JS 實現快取演算法(FIFO/LRU)JS快取演算法
- Lru在Rust中的實現, 原始碼解析Rust原始碼
- Python 中 lru_cache 的使用和實現Python
- Java的通過管道來實現執行緒通訊Java執行緒
- LinkedHashMapHashMap
- 通過API介面實現圖片上傳API
- Python 通過List 實現佇列的操作Python佇列
- Flutter | 通過 ServiceLocator 實現無 context 導航FlutterContext
- 通過 ProxyChains-NG 實現終端代理AI
- 通過Go實現AES加密和解密工具Go加密解密
- 通過NATAPP技術實現內網穿透APP內網穿透
- LeetCode146 動手實現LRU演算法LeetCode演算法
- LRU演算法四種實現方式介紹演算法
- LRU快取替換策略及C#實現快取C#
- Leetcode LRU快取,陣列+結構體實現LeetCode快取陣列結構體
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- 【實戰】通過Python實現疫情地圖視覺化Python地圖視覺化