LinkedHashMap removeEldestEntry:删除了多少个元素?

时间:2012-07-26 12:19:11

标签: java linkedhashmap

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

可能类似于Guava CacheBuilder might be what you're looking for

答案 1 :(得分:2)

  

LinkedHashMap看起来很棒,可以实现LRU Cache。它在链表管理方面有一些开销

所有LRU缓存都是如此。

  

而非线程安全

您可以使用Collections.synchronizedMap()

  

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

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

来自LinkedHashMap的来源

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

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

不是。

  

我认为重组操作非常昂贵。

只有在容量增加时才会进行重新散列,而不是在删除条目时。