【发布时间】:2012-08-15 08:16:51
【问题描述】:
我对如何使用 LinkedHashMap (How would you implement an LRU cache in 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 使用名为header 的Entry object 作为起始节点来链接您添加到地图的所有项目。所以在这种情况下,它将是
[header] -> ["a"] -> ["b"] -> ["c"] -> ["d"] -> [header]
headerEntry对象是双向链表的开始和结束,因为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]
只是想澄清一下。
【问题讨论】:
标签: java linkedhashmap