LinkedHashMap removeEldestEntry:删除了多少元素



LinkedHashMap在实现LRU缓存方面表现出色。它在链表管理方面有一些开销,而且不是线程安全的,但它简化了实现,我可以在代码中处理这些问题。

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

它只删除一个元素吗?或者占总尺寸的某个百分比。我担心的是,如果它只删除一个元素来放置新元素,那么这将是一个真正的性能问题。正如我所看到的那样,再洗操作成本非常高。

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

LinkedHashMap可以很好地实现最琐碎的缓存,但对于更高级的需求,它可能并不理想。

removeEldestEntry返回true将导致删除单个最长条目,无法将其调整为多个元素。

也许像Guava CacheBuilder这样的东西可能就是你想要的。

LinkedHashMap在实现LRU缓存方面看起来非常出色。它在链表管理方面有一些开销

这适用于所有LRU缓存。

并且不是线程安全

您可以使用Collections.synchronizedMap()

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

删除最长的条目。也就是说,只有一个。

来自LinkedHashMap 的源

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

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

事实并非如此。

正如我所看到的那样,再洗操作成本非常高。

只有在容量增长时才会进行重新哈希,而不是在删除条目时。

最新更新