我刚开始使用哈希表结构。我正在使用 LinkedHashMap(例如:cache = new LinkedHashMap<K,V>(...)
)来实现我自己的缓存。我有一个关于这个数据结构的问题列表:
我设置了一个参数 capacity = 100(例如),这意味着桶中的项目数限制为 100。然后如果我将一个新项目插入到这个缓存中(当缓存大小 = 100 时),我我正确地认为驱逐政策将会发生?
在我的实现中,键是复合对象,包括如下两个项目:
class Key { public string a; public string b; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((a == null) ? 0 : a.hashCode()); result = prime * result + ((b == null) ? 0 : b.hashCode()); return result; } }
有了这个
hashcode()
,假设桶中已经有 100 个项目。当我插入一个新项目时,假设hashcode()
返回与前一个项目的重复键,我的理解是 linkedhashmap 将使用逐出策略删除最老的项目并使用 linkedlist 处理新项目的冲突,因此桶中的项目数将为 99。对吗?有什么方法可以识别当前桶中的哪些条目包含句柄冲突链?
最佳答案
回答问题一:
- 您需要显式覆盖方法
removeEldest
才能使驱逐生效。
默认实现返回 false,所以它不会删除任何元素:
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}
问题二:如果您不重写方法
removeEldest
,您的案例中不会删除任何内容
问题三:我认为没有办法处理这种情况。
请阅读这篇有用的文章,以更加熟悉基于 LinkedHahMap 的驱逐算法:
http://javarticles.com/2012/06/lru-cache.html
对于补充讲座,另请阅读有关 LFU 驱逐的信息:http://javarticles.com/2012/06/lfu-cache.html
关于java - 在 Java 中使用 LinkedHasMap 进行缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36543087/