: O. Yuanying

ReferenceMapを使ってデータをメモリにキャッシュ

先日「LRUMapを使ってメモリにキャッシュ」というエントリーを書きましたが、これだと他に参照が存在している場合にもmapからの参照が削除されてしまう場合があります。微妙に不便。

そんな訳で「org.apache.commons.collections.map.ReferenceMap」を使いましょう。

Integer test1 = new Integer(200);
Integer test2 = new Integer(300);
Integer test3 = new Integer(400);

ReferenceMap map = new ReferenceMap(
    ReferenceMap.HARD,
    ReferenceMap.WEAK);

map.put("test1", test1);
map.put("test2", test2);
map.put("test3", test3);

System.gc();

System.out.println("test1: " + map.get("test1"));
test1 = new Integer(600);

System.gc();

System.out.println("test1: " + map.get("test1"));

んで下が出力。

test1: 200
test1: null

おー、ちゃんとGCの際には参照が削除されてる。

んで、メモリに余裕がある場合にGCの対象とされたくなかった場合は、

ReferenceMap map = new ReferenceMap(
    ReferenceMap.HARD,
    ReferenceMap.SOFT);

とすればよい。