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);
我担心的是,如果它只删除一个元素来放置新元素,那么这将是一个真正的性能问题。
事实并非如此。
正如我所看到的那样,再洗操作成本非常高。
只有在容量增长时才会进行重新哈希,而不是在删除条目时。