gpt4 book ai didi

java - 使用 get 时 LRUCache 条目重新排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:57:16 26 4
gpt4 key购买 nike

我查看了 LRUCache 的官方 Android 文档,其中说:每次访问一个值时,它都会被移到队列的头部。当一个值被添加到一个完整的缓存中时,该队列末尾的值被逐出并且可能有资格进行垃圾收集。我想这是由缓存使用的 linkedhashmap 维护的双向链表。为了检查此行为,我检查了 LruCache 的源代码,并检查了 get(K key) 方法。它进一步调用 map 的 get 方法,该方法从底层 hashmap 获取值并调用 recordAccess 方法。

public V get(Object key) {
LinkedHashMapEntry<K,V> e = (LinkedHashMapEntry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}

recordAccess 方法依次将访问的条目移动到列表的末尾,以防 accessOrder 设置为 true(对于我的问题,让我们假设它是),否则它什么都不做。

/**
* This method is invoked by the superclass whenever the value
* of a pre-existing entry is read by Map.get or modified by Map.set.
* If the enclosing Map is access-ordered, it moves the entry
* to the end of the list; otherwise, it does nothing.
*/
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
if (lm.accessOrder) {
lm.modCount++;
remove();
addBefore(lm.header);
}
}

这听起来与上面所说的元素被移动到队列头部的说法相矛盾。相反,它被移动到列表的最后一个元素(使用 head.before)。当然,我在这里遗漏了什么,有什么帮助吗?

最佳答案

你没有遗漏任何东西,只是你正在阅读 LinkedHashMapLruCache 文档。 LinkedHashMap 有自己的文档,特别是关于它的 accessOrder . (与 Java docs 相同)。

[...when accessOrder=true...] order of iteration is the order in which its entries were last accessed, from least-recently accessed to most-recently (access-order)

因此 LinkedHashMap 将最近使用的条目放在末尾,并记录在案。

实际上 LruCache 描述了这种缓存在理论上是如何工作的,但是 LinkedHashMap 展示了如何在不添加单独的向后移动迭代器的情况下实现它:通过将最近的元素放在最后, trimming可以使用已经可用的(向前移动的)迭代器来有效地访问(和删除)旧元素。

尽管此时此地我无法判断 removeEldestEntry 出了什么问题.也许过去不存在。

关于java - 使用 get 时 LRUCache 条目重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com