読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

LinkedHashMapでFIFO方式のキャッシュをさくっと作る。

Java

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