使用 Java.util.LinkedHashMap 实现 LRU、FIFO 算法
一、LRU算法实现
package learn.lru;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class LRU<K, V> {
private final int MAX_CACHE_SIZE;
private final float DEFAULT_LOAD_FACTORY = 0.75f;
LinkedHashMap<K, V> map;
public LRU(int cacheSize) {
MAX_CACHE_SIZE = cacheSize;
int capacity = (int) (Math.ceil(MAX_CACHE_SIZE/DEFAULT_LOAD_FACTORY)+1);
/**
* @see java.util.LinkedHashMap
*/
map = new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, true){
protected boolean removeEldestEntry(java.util.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();
}
@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) {
LRU<Integer, Integer> lru = new LRU<Integer, Integer>(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);
}
}
二、效果
1:1 2:2 3:3
2:2 3:3 1:1
3:3 1:1 4:4 5:5 6:6
三、FIFO算法实现
将LRU.java第19行改为
map = new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, false)
一一一一一一一一一一一一一一一一一一一一一一一一一 传送门 一一一一一一一一一一一一一一一一一一一一一一一一一一一