LinkedHashMapを使用してLRUキャッシュを構築する方法(Java 6でLRUキャッシュをどのように実装しますか?)について少し混乱しています。内部でどのように機能するかを確実に理解したいと思います。
LinkedHashMapを拡張し、そのままオーバーライドするクラスLRUMapを定義するとしますremoveEldestEntry(final Map.Entry<A, B> eldest)
。
次に、データ構造を構築し、4つのアイテムをマップに挿入します
LRUMap<String,String> map = new LRUMap<String,String>(3); //capacity 3
map.put("a", "a");
map.put("b", "b");
map.put("c", "c");
map.put("d", "d");
そして、マップに追加するすべてのアイテムとリンクするために、開始ノードとして呼び出されたものを相互にLinkedHashMap
使用します。したがって、この場合はEntry object
header
[header] -> ["a"] -> ["b"] -> ["c"] -> ["d"] -> [header]
ヘッダーエントリオブジェクトは、header.before = header.after =ヘッダーが最初に作成されるため、二重リンクリストの開始と終了の両方になります。
そして、マップが私が望む最大エントリ(3アイテム)に達したとしましょう。
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) {
removeEntryForKey(eldest.key);
}
.....
つまり、最初に["a"]を削除するということですか?
そして、呼び出したときget(Object key)
に、ヘッダーノードの前にそのキー(「b」としましょう)を配置するリストの順序を再配置します。
[header] -> ["c"] -> ["d"] -> ["b"] -> [header]
それを明確にしたいだけです。