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

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

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; } }; 

您正在寻找LRU缓存吗? 这是一篇基于LinkedHashMap的博客文章。

您可能需要考虑使用Apache Collections。 他们有一堆LRU实现。 否则,您可以轻松地为标准库集合编写类似的包装器; 我不认为有一个你可以直接使用。

您可以使用双端队列或Deque ,只需在最大计数时删除第一个项目。

如果您有并发需求,请不要尝试自己解决此问题。 Guava的CacheBuilder有一个.maximumSize()方法,允许你限制地图的大小,虽然我的理解是在实际达到限制之前可以清除旧条目。

关于数据结构的设计有一个有趣的页面 ,这应该给读者留下了比Google的实现更难做的事情。 🙂

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