いろいろ調べてみる。
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 件のコメント:
コメントを投稿