2

LinkedHashMap实现 LRU 缓存看起来很棒。它在链表管理方面有一些开销并且不是线程安全的,但是它简化了实现,我可以在我的代码中处理这些。

我有一个问题,到目前为止我还没有找到答案,如果实现了 removeEldestEntry 并且 put 发现列表已满,LinkedHashMap 从列表中删除了多少元素。

它是否只删除一个元素?或总大小的某个百分比。我担心的是,如果它只删除一个元素来放置新元素,那么它就是一个真正的性能问题。正如我所见,重新哈希操作非常昂贵。

请有人建议它是如何工作的,如果我可以使用 InitialCapacity、LoadFactor 或任何其他方式管理这些要删除的元素计数。

4

2 回答 2

4

LinkedHashMap实现最简单的缓存很好,但对于更高级的要求,它可能并不理想。

true从返回removeEldestEntry将导致单个、最老的条目被删除,没有办法将其调整为多个元素。

也许像番石榴这样的东西 可能是你正在寻找的东西CacheBuilder

于 2012-07-26T12:22:20.013 回答
2

LinkedHashMap 在实现 LRU 缓存方面看起来很棒。它在链表管理方面有一些开销

这适用于所有 LRU 缓存。

并且不是线程安全的

您可以使用 Collections.synchronizedMap()

我有一个问题,到目前为止我还没有找到答案,如果实现了 removeEldestEntry 并且 put 发现列表已满,LinkedHashMap 从列表中删除了多少元素。

删除最旧的条目。即只有一个。

来自 LinkedHashMap 的来源

    if (removeEldestEntry(eldest)) {
        removeEntryForKey(eldest.key);

我担心的是,如果它只删除一个元素来放置新元素,那么它就是一个真正的性能问题。

它不是。

正如我所见,重新哈希操作非常昂贵。

重新散列仅在容量增长时发生,而不是在删除条目时发生。

于 2012-07-26T12:38:17.627 回答