Java LinkedHashMap RemoveedStantry:删除了多少元素?

Java LinkedHashMap RemoveedStantry:删除了多少元素?,java,linkedhashmap,Java,Linkedhashmap,LinkedHashMap实现LRU缓存看起来很棒。它在链表管理方面有一些开销,并且不是线程安全的,但是它简化了实现,我可以在代码中处理这些开销 我有一个问题,到目前为止我还没有找到答案,那就是如果RemoveedStantry被实现,并且put发现列表已满,LinkedHashMap会从列表中删除多少元素 它只删除一个元素吗?或者占总尺寸的某个百分比。我担心的是,如果它只删除一个元素来放置新元素,那么这将是一个真正的性能问题。正如我所看到的,重建工作的费用非常昂贵 请有人建议它是如何工作的,以

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

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

它只删除一个元素吗?或者占总尺寸的某个百分比。我担心的是,如果它只删除一个元素来放置新元素,那么这将是一个真正的性能问题。正如我所看到的,重建工作的费用非常昂贵


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

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

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

也许是类似的

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

这适用于所有LRU缓存

而且不是线程安全的

您可以使用Collections.synchronizedMap()

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

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

从LinkedHashMap的源

    if (removeEldestEntry(eldest)) {
        removeEntryForKey(eldest.key);
我担心的是,如果它只删除一个元素来放置新元素,那么这将是一个真正的性能问题

事实并非如此

正如我所看到的,重建工作的费用非常昂贵


只有当容量增加时,才会进行重新灰化,而不是删除条目。

感谢Jeff,Peter的回复,那么我不使用Removeedestentry,而是在缓存元素中保留元素的年龄,每当我的覆盖放置发现缓存已满时,它会删除大约20%的最旧元素。另外,我不允许get方法从缓存中返回任何已过期的元素。为什么不删除任何已过期的元素,以及删除任何已过期的元素呢。如果你删除了20%,你可以删除那些没有过期的元素。是的,我可以用这种方式删除那些没有过期的元素。就删除1个exprired元素而言,我的get方法会这样做,并将null返回给调用方。