LinkedHashMap
看起来很棒,可以实现LRU Cache。它在链表管理方面有一些开销,而不是线程安全,但它简化了实现,我可以在我的代码中处理这些。
到目前为止我没有找到答案的问题是如果实现了removeEldestEntry并且put发现列表已满,LinkedHashMap会从列表中删除多少个元素。
它只删除一个元素吗?或总大小的一定百分比。我担心的是,如果只删除一个元素来放置新元素,那么它就是一个真正的性能问题。我认为重组操作非常昂贵。
请有人建议它是如何工作的,如果我可以使用InitialCapacity,LoadFactor或任何其他方式管理这些被删除的元素。
答案 0 :(得分:3)
LinkedHashMap
很适合实现最简单的缓存,但是对于更高级的要求,它可能并不理想。
从true
返回removeEldestEntry
将导致单个,最长条目被删除,无法将其调整为多个元素。
答案 1 :(得分:2)
LinkedHashMap看起来很棒,可以实现LRU Cache。它在链表管理方面有一些开销
所有LRU缓存都是如此。
而非线程安全
您可以使用Collections.synchronizedMap()
到目前为止我没有找到答案的问题是如果实现了removeEldestEntry并且put发现列表已满,LinkedHashMap会从列表中删除多少个元素。
删除最老的条目。即一个也只有一个。
来自LinkedHashMap的来源
if (removeEldestEntry(eldest)) {
removeEntryForKey(eldest.key);
我担心的是,如果只删除一个元素来放置新元素,那么它就是一个真正的性能问题。
不是。
我认为重组操作非常昂贵。
只有在容量增加时才会进行重新散列,而不是在删除条目时。