是否有一种技术可以让我指定一个数字 n,以便在插入第 (n + 1) 个条目时,首先删除最旧的条目,确保哈希表的大小始终限制为 n?
Obediah Stane
问问题
6020 次
6 回答
28
LinkedHashMap正是这样做的,请参阅 javadoc 中的removeEldestEntry方法。
像这样的东西应该可以解决问题,这将删除最旧的插入条目:
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;
}
};
于 2009-01-07T22:11:48.457 回答
5
您可能正在寻找LRU 缓存?这是一篇基于LinkedHashMap的博客文章。
于 2009-01-07T21:34:15.663 回答
0
您可能需要考虑使用 Apache Collections。他们有一堆 LRU 实现。否则,您可以轻松地为标准库集合编写类似的包装器;我不认为有一个你可以直接使用。
于 2009-01-07T21:37:30.727 回答
0
您可以使用双端队列或Deque,并在达到最大计数时删除第一项。
于 2009-01-07T21:41:41.543 回答
0
如果你有并发需求,不要试图自己解决这个问题。Guava 的CacheBuilder有一个 .maximumSize() 方法,允许您限制地图的大小,尽管我的理解是在您实际达到限制之前可能会清除旧条目。
有一个关于数据结构设计的有趣页面,它应该让读者印象深刻,要做得比谷歌的实现更好是多么困难。:)
于 2013-08-22T21:05:25.040 回答
-1
如果您正在缓存,您可以使用 WeakHashMap 或 WeakReference,然后不必担心缓存的大小。
于 2009-01-07T21:57:30.530 回答