【问题标题】:How do I limit the number of entries in a java hashtable?如何限制 java 哈希表中的条目数?
【发布时间】:2010-09-30 03:32:11
【问题描述】:

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

【问题讨论】:

  • 这类似于stackoverflow.com/questions/272674/…。这个问题提供了一个解决方案。
  • @robhruska - 你认为这算作重复吗?我在围栏上。
  • 我不确定。观点有点不同,因为这个问题是关于“大小限制”,而另一个问题是针对“不经常使用”的条目。我不反对让它保持开放,如果只是为了让那些从这个问题的角度来看它的人有更多的可搜索性。

标签: java hashtable


【解决方案1】:

您可能正在寻找LRU cache?这是一篇基于 LinkedHashMap 的博文。

【讨论】:

  • 我来这里提一下LinkedHashMap,我最近用来做LRU缓存的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用双端队列或Deque,并在达到最大计数时删除第一项。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 只是为了澄清以避免传播一个常见的误解:WeakHashMap 本身不适合 LRU 缓存;它对键使用弱引用,而不是值。它非常适合保存有关不“属于”您的对象的元数据;不是假设当内存用完时条目会被丢弃
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果你有并发需求,不要试图自己解决这个问题。 Guava 的 CacheBuilder 有一个 .maximumSize() 方法,可以让您限制地图的大小,尽管据我了解,旧条目可能会在您实际达到限制之前被清除。

        在数据结构的设计上有an interesting page,这应该让读者印象深刻,要做得比谷歌的实现更好是多么困难。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          相关资源
          最近更新 更多