如何限制java哈希表中的条目数?

时间:2009-01-07 21:32:10

标签: java hashtable

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

6 个答案:

答案 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,然后不必担心缓存的大小。