日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LRU 实现缓存

發布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LRU 实现缓存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LRU:Least Recently used 最近最少使用

?

1.使用LinkedHashMap實現 inheritance實現方式 繼承map類 可以使用Collections.synchronizedMap方式實現線程安全的操作

public class LruCache<K,V> extends LinkedHashMap<K,V> {private final int MAX_CACHE_SIZE;public LruCache(int cacheSize) {super((int)Math.ceil(cacheSize/0.75)+1,0.75f,true );MAX_CACHE_SIZE = cacheSize;}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest){return size()> MAX_CACHE_SIZE;}@Overridepublic String toString(){StringBuilder sb= new StringBuilder();for(Map.Entry<K,V> entry : entrySet()){sb.append(String.format("%s:%s",entry.getKey(),entry.getValue()));}return sb.toString();} }

2、LinkedHashMap 使用delegation方式實現

沒有map接口?

public class LruByDelegation<K,V> {private final int MAX_CACHE_SIZE;private final float DEFAULT_LOAD_FACTOR = 0.75f;LinkedHashMap<K,V> map;public LruByDelegation(int cacheSize) {this.MAX_CACHE_SIZE = cacheSize;int capacity = (int) (Math.ceil(MAX_CACHE_SIZE/DEFAULT_LOAD_FACTOR)+1);map= new LinkedHashMap(capacity,DEFAULT_LOAD_FACTOR,true){@Overrideprotected boolean removeEldestEntry(Map.Entry eldest){return size()>MAX_CACHE_SIZE;}};}public synchronized void put(K key,V value){map.put(key,value);}public synchronized V get(K key){return map.get(key);}public synchronized void remove(K key){map.remove(key);}public synchronized Set<Map.Entry<K,V>> getAll(){return map.entrySet();}public synchronized int size(){return map.size();}public synchronized void clear(){map.clear();}@Overridepublic String toString(){StringBuilder sb= new StringBuilder();for(Map.Entry entry : map.entrySet()){sb.append(String.format("%s:%s",entry.getKey(),entry.getValue()));}return sb.toString();}}

2 Cache鏈表+HashMap實現? ?Entry自己定義? 總結一下就是各種pre 和 next指針的變換

public class LruCache01<K,V> {private final int MAX_CACHE_SIZE;private Entry first;private Entry last;private HashMap<K, Entry<K,V>> hashMap;public LruCache01(int MAX_CACHE_SIZE) {this.MAX_CACHE_SIZE = MAX_CACHE_SIZE;hashMap=new HashMap<>();}public void put(K key, V value){Entry entry = getEntry(key);if(entry==null){if(hashMap.size()>=MAX_CACHE_SIZE){hashMap.remove(last.key);//removeLast removeLast();}entry=new Entry();entry.key=key;}entry.value=value;moveToFirst(entry);hashMap.put(key,entry);}public V get(K key){Entry entry = getEntry(key);if(entry==null)return null;moveToFirst(entry);return (V) entry.value;}public void remove(K key){Entry entry = getEntry(key);if(entry!=null){if(entry.pre!=null)entry.pre.next=entry.next;if(entry.next!=null)entry.next.pre=entry.pre;if(entry==first)first=entry.next;if(entry==last)last=entry.pre;}hashMap.remove(key);}public void moveToFirst(Entry entry){if(entry==first)return;if(entry.pre!=null)entry.pre.next=entry.next;if(entry.next!=null)entry.next.pre=entry.pre;if(entry==last)last=last.pre;if(first==null || last==null){first=last=entry;return;}entry.next=first;first.pre=entry;first=entry;entry.pre=null;}public void removeLast(){if(last!=null){last=last.pre;if(last==null)first=null;elselast.next=null;}}public Entry<K,V> getEntry(K key){return hashMap.get(key);}@Overridepublic String toString(){StringBuilder sb= new StringBuilder();Entry entry = first;while(entry!=null){sb.append(String.format("%s:%s",entry.key,entry.value));entry=entry.next;}return sb.toString();} } class Entry<K,V>{public Entry pre;public Entry next;public K key;public V value; }

LinkedHashMap的FIFO實現

只需要重新removeEldestEntry方法可以實現FIFO緩存

final int cacheSize=5; LinkedHashMap<Integer,String> lru = new LinkedHashMap<Integer,String>(){@Override protected boolean removeEldestEntry(Map.Entry<Integer,String> eldest){ return size()>cacheSize;} }

?

轉載于:https://www.cnblogs.com/zhy-study/p/9498560.html

總結

以上是生活随笔為你收集整理的LRU 实现缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。