是否有一种技术可以指定数字n,这样当插入第(n + 1)个条目时,首先删除最旧的条目,确保哈希表的大小始终限制为n?
答案 0 :(得分:28)
LinkedHashMap完全相同,请参阅removeEldestEntry方法的javadoc。
这样的事情可以解决问题,这将删除最旧的插入条目:
Map map = new LinkedHashMap() {
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > N;
}
};
您还可以通过在构造函数中指定它来删除最早访问的条目:
Map map = new LinkedHashMap(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > N;
}
};
答案 1 :(得分:5)
你正在寻找LRU cache吗?这是一篇基于LinkedHashMap的博客文章。
答案 2 :(得分:0)
您可能需要考虑使用Apache Collections。他们有一堆LRU实现。否则,您可以轻松地为标准库集合编写类似的包装器;我不认为有一个你可以直接使用。
答案 3 :(得分:0)
您可以使用双端队列,或Deque,只需在最大数量时删除第一项。
答案 4 :(得分:0)
如果您有并发需求,请不要尝试自己解决此问题。 Guava的CacheBuilder有一个.maximumSize()方法,允许你限制地图的大小,虽然我的理解是在实际达到限制之前可以清除旧条目。
数据结构的设计有an interesting page,这会给读者留下深刻的印象,比Google的实施做得更好。 :)
答案 5 :(得分:-1)
如果您正在缓存,可以使用WeakHashMap或WeakReference,然后不必担心缓存的大小。