いろいろ調べてみる。
LinkedHashMapを利用するとすごく簡単にFIFOタイプLRUタイプのキャッシュが
簡単に出来ることがわかった。
FIFO…最初に入ったやつ(古いものから追い出す)タイプ
LRU…一番最後に利用されたものから追い出すタイプ
こんな簡単に実装できるとはびっくりした。
下記がサンプルです。
import java.util.LinkedHashMap;
import java.util.Map.Entry;
public class CacheSample {
private static class FIFOCache<K,V> extends LinkedHashMap<K,V>{
/**
*
*/
private static final long serialVersionUID = 1L;
private int maxEntries;
public FIFOCache(int maxEntries) {
super(maxEntries,(float) 0.75,false);
this.maxEntries=maxEntries;
}
protected boolean removeEldestEntry(Entry<K,V> eldest) {
return size()>maxEntries;
}
}
private static class LRUCache<K,V> extends LinkedHashMap<K,V>{
/**
*
*/
private static final long serialVersionUID = 1L;
private int maxEntries;
public LRUCache(int maxEntries) {
super(maxEntries,(float) 0.75,true);
this.maxEntries=maxEntries;
}
protected boolean removeEldestEntry(Entry<K,V> eldest) {
return size()>maxEntries;
}
}
public static void main(String[] args) {
System.out.println("FIFOの場合");
//上限50個のFIFOキャッシュを作成
FIFOCache<Integer,String> fifocache = new FIFOCache<Integer,String>(50);
testCache(fifocache);
System.out.println("LRUの場合");
//上限50個のLRUキャッシュを作成
LRUCache<Integer,String> lrucache = new LRUCache<Integer,String>(50);
testCache(lrucache);
}
private static void testCache(LinkedHashMap<Integer,String> cache) {
for (int i=0;i<50;i++){
cache.put(new Integer(i), "HOGE"+i);
}
System.out.println(cache.get(new Integer(0)));
for (int i=50;i<70;i++){
cache.put(new Integer(i), "HOGE"+i);
}
if (cache.containsKey(new Integer(0))){
System.out.println("0が残っている");
}else{
System.out.println("0が消えている");
}
}
}
0 件のコメント:
コメントを投稿