我对如何使用 LinkedHashMap 构建 LRU 缓存感到有些困惑(您将如何在 Java 6 中实现 LRU 缓存?),并且我想确保我了解它在幕后内部是如何工作的。
假设我定义了一个类 LRUMap,它扩展了 LinkedHashMap 并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 Entry 对象是双向链表的开始和结束,因为 header.before = header.after = header 在最初构造时。
假设地图达到了我想要的最大条目(3 个项目),并且从
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) {
removeEntryForKey(eldest.key);
}
.....
那么这是否意味着它将首先删除 ["a"] ?
当我们调用它时get(Object key)
,它会重新排列列表顺序,它将那个键(比如说“b”)放在头节点之前,所以它变成了
[header] -> ["c"] -> ["d"] -> ["b"] -> [header]
只是想澄清一下。