LinkedHashMapでFIFO方式のキャッシュをさくっと作る。
LinkedHashMapを使うとFIFO方式のキャッシュがさくっと作成できます。新しいエントリが追加されるたびに呼び出されるremoveEldestEntry()をオーバーライドして、削除するかどうかの判定処理を書くだけでOK。
public static void main( String[] args ) { // 要素を5個だけ保持するFIFO方式のキャッシュ Map<String, String> cache = new LinkedHashMap<String, String>(5) { @Override protected boolean removeEldestEntry(Map.Entry<String,String> eldest) { return size() > 5; } }; // 要素を追加 cache.put( "a", "1" ); cache.put( "b", "2" ); cache.put( "c", "3" ); cache.put( "d", "4" ); cache.put( "e", "5" ); print( cache ); // さらにキャッシュを追加。/ aが消されてxが保持される。 cache.put( "x", "10" ); print( cache ); } /** * キャッシュの内容を表示する。 * @param cache キャッシュ */ private static void print(Map<String,String> cache) { System.out.println( "\n---" ); for ( Map.Entry<String, String> e : cache.entrySet() ) { System.out.println( e.getKey() + ":" + e.getValue() ); } }
実行結果です。
--- a:1 b:2 c:3 d:4 e:5 --- b:2 c:3 d:4 e:5 x:10
こうすればLRU方式のキャッシュにもなったり。アトミックじゃないよね、とかいう話はあるので実用は注意な。
public static void main( String[] args ) { // 要素を5個だけ保持するLRU方式のキャッシュ Map<String, String> cache = new LinkedHashMap<String, String>(5) { @Override protected boolean removeEldestEntry(Map.Entry<String,String> eldest) { return size() > 5; } public String get( Object key ) { String value = super.get( key ); if ( value != null ) { remove( key ); put( (String) key, value ); // 要素があった、ということはキーはStringのハズ。 } return value; } }; // 要素を追加 cache.put( "a", "1" ); cache.put( "b", "2" ); cache.put( "c", "3" ); cache.put( "d", "4" ); cache.put( "e", "5" ); print( cache ); // キャッシュのデータを参照 / 参照したデータは破棄の優先順位が下がる cache.get( "a" ); cache.get( "c" ); // さらにキャッシュを追加。/ b が消されてxが保持される。 cache.put( "x", "10" ); print( cache ); }
実行結果です。
--- a:1 b:2 c:3 d:4 e:5 --- d:4 e:5 a:1 c:3 x:10