基於LinkedHashMap的LRU快取實現(FIFO亦可)
阿新 • • 發佈:2021-01-07
import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; /** * @author wh445306 * @version 1.0 * @Desciption:LRUCache 參考:https://www.cnblogs.com/lzrabbit/p/3734850.html * @date 2021-01-06 18:06 */ public class LRUCache <K, V>{ private final int MAX_CACHE_SIZE; private final float DEFAULT_LOAD_FACTORY = 0.75f; LinkedHashMap<K, V> map; public LRUCache(int cacheSize) { MAX_CACHE_SIZE = cacheSize; int capacity = (int)Math.ceil(MAX_CACHE_SIZE / DEFAULT_LOAD_FACTORY) + 1; /* * HashMap負載因子預設即為0.75,是一個折衷的取值 * 第三個引數設定為true,代表linkedlist按訪問順序排序,可作為LRU快取 * 第三個引數設定為false,代表按插入順序排序,可作為FIFO快取 */ map = new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, true) { @Override protected boolean removeEldestEntry(Map.Entry<K, V> 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(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (Map.Entry<K, V> entry : map.entrySet()) { sb.append(String.format("%s: %s ", entry.getKey(), entry.getValue())); } return sb.toString(); } //測試 public static void main(String[] args) { LRUCache<Integer, Integer> lru = new LRUCache<>(5); lru.put(1, 1); lru.put(2, 2); lru.put(3, 3); System.out.println(lru); lru.get(1); System.out.println(lru); lru.put(4, 4); lru.put(5, 5); lru.put(6, 6); System.out.println(lru); } }
效果: