java – 什么是像哈希表的数据结构类型,但不经常使用的键被删除?

我正在寻找类似于哈希表的数据结构,但是表的大小限制.当哈希中的项目数量达到大小限制时,应该调用一个剔除函数来摆脱表中最少检索的键/值对.

这是我正在做的一些伪代码:

class MyClass {
  private Map<Integer, Integer> cache = new HashMap<Integer, Integer>();
  public int myFunc(int n) {
    if(cache.containsKey(n))
      return cache.get(n);
    int next = . . . ; //some complicated math.  guaranteed next != n.
    int ret = 1 + myFunc(next);
    cache.put(n, ret);
    return ret;
  }
}

会发生什么情况是有一些n值,其中myFunc()将被调用很多次,但n的许多其他值只会被计算一次.因此,缓存可以填满数百万个再也不需要的值.我希望有一种缓存自动删除不经常检索的元素的方法.

这感觉就像一个必须解决的问题,但我不知道我将用它来有效地处理数据结构.任何人都可以指向正确的方向吗?

更新我知道这必须是一个已经解决的问题.它被称为LRU缓存,并且通过扩展LinkedHashMap类很容易.以下是包含解决方案的代码:

class MyClass {
  private final static int SIZE_LIMIT = 1000;
  private Map<Integer, Integer> cache =
    new LinkedHashMap<Integer, Integer>(16, 0.75f, true) {
      protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest)
      {
        return size() > SIZE_LIMIT;
      }
  };
  public int myFunc(int n) {
    if(cache.containsKey(n))
      return cache.get(n);
    int next = . . . ; //some complicated math.  guaranteed next != n.
    int ret = 1 + myFunc(next);
    cache.put(n, ret);
    return ret;
  }
}
最佳答案
你正在寻找一个LRUList /地图.查看LinkedHashMap:

当将新的映射添加到地图时,removeEldestEntry(Map.Entry)方法可能会被覆盖,以强制执行自动删除过时映射的策略.

转载注明原文:java – 什么是像哈希表的数据结构类型,但不经常使用的键被删除? - 代码日志