您的位置:首页 > 编程语言 > Java开发

使用 Java.util.LinkedHashMap 实现 LRU、FIFO 算法

2017-06-26 15:14 701 查看

使用 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)

一一一一一一一一一一一一一一一一一一一一一一一一一  传送门  一一一一一一一一一一一一一一一一一一一一一一一一一一一
文章系转载,更多详情见:Java实现缓存(LRU,FIFO)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: