[Javaの小枝] LinkedHashMapを使ったLRUキャッシュ


内容はないよう

タイトルにあるように LinkedHashMap を用いて LRU キャッシュを簡単に作成できる、というのを何かで以前読んで記憶していた。LinkedHashMapはキーの順序を保持するタイプのマップで、キーの順序には「挿入順モード」と「アクセス順モード」の二つが存在する。LRUキャッシュの部品として使う場合、後者のアクセス順モードにてキーを保持すれば良い、という訳だ。

で、今回仕事で LRU キャッシュを使う必要があり、確認のため JavaDoc を見ると著しく不安をかきたてる日本語が書かれていた…

「アクセス順のリンク・ハッシュ・マップでは get でマップを照会することだけが構造的変更です。」
なんだとっ!! もしかして put しても構造的変更(=キー順序の入れ替え)にならない?

思わず検証してしまった。(-_-;; 当然そんなことはなかった。(-_-;;

対応する英語版は以下の通り。「単なるgetクエリだけでも構造的変更となります」と書かれている。つまりは get と put の両方で構造的変更が発生する。

日本語版にいろいろ誤訳があるのは諦観の念を持ってはいるが、このレベルの誤訳はさすがに不安になるのでかんべんしてほしい。まとめると、LRUキャッシュを作成する際、安心して以下のように書いてかまわない。

Lru.java
Map<String, Long> lruCache = new LinkedHashMap<String, Long>(16, 0.75f, true)