9

是否有一种技术可以让我指定一个数字 n,以便在插入第 (n + 1) 个条目时,首先删除最旧的条目,确保哈希表的大小始终限制为 n?

4

6 回答 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

如果您正在缓存,您可以使用 Wea​​kHashMap 或 WeakReference,然后不必担心缓存的大小。

于 2009-01-07T21:57:30.530 回答