Java LinkedHashMapを使って、LRU方式でキャッシュする




LRUは、キャッシュでよくある方法ですよね。

LinkedHashMapを使って、LRU方式でキャッシュするサンプル

LinkedHashMapにデータをキャッシュします。
また、キャッシュしたデータから取得、データの追加をして、それぞれの時点でキャッシュの中身を確認します。

実行結果

LinkedHashMapにキャッシュした中身を出力されます。
途中で、”2″にアクセスしているので、順序が変わっています。
追加後も、格納している数は変わりませんね。

サンプルの解説

今回は、LinkedHashMapを継承して作っています。
ポイントは、LinkedHashMap#removeEldestEntry(Map.Entry)です。
このメソッドは、putなどのアイテム追加のメソッドから呼び出されます。

この例では、アイテム追加時、上限サイズ(3)を超えた場合、削除するようにtrueを返しています。
また、今回の例では意味を成していませんが、Collections.synchronizedMap(Map)で、スレッドセーフのマップにしています。

ちなみに、LinkedHashMapは、このような特別な理由がなければ、あまり使いません。
名前の通り、HashMapを拡張したものなので、HashMapに比べて少し性能が下がります。
単に連想配列レベルで使用するだけなら、素直にHashMapを使いましょう。