Java 支持基于最近访问的项的有效退出策略的数据结构

Java 支持基于最近访问的项的有效退出策略的数据结构,java,data-structures,Java,Data Structures,我需要一个数据结构,该结构将支持针对最长时间前请求的项目的最有效的取消策略。e、 g我有一大堆的物品被不时地索取。当我的内存用完时,我想清除数据结构中最旧的项(散列映射) 我在考虑FIFO ds smth类队列,但我不确定如何处理这种情况: -->a b c d a--> a是最古老和最新的商品。如果再次添加“a”,我需要搜索整个队列以删除它。这是非常低效的,但我想不出任何有效的方法来做这件事。也许是某种树结构,让访问最少的一个保持在顶部 在Java中已经有这样的数据结构的实现了吗?编辑:Lin

我需要一个数据结构,该结构将支持针对最长时间前请求的项目的最有效的取消策略。e、 g我有一大堆的物品被不时地索取。当我的内存用完时,我想清除数据结构中最旧的项(散列映射)

我在考虑FIFO ds smth类队列,但我不确定如何处理这种情况:

-->a b c d a-->

a是最古老和最新的商品。如果再次添加“a”,我需要搜索整个队列以删除它。这是非常低效的,但我想不出任何有效的方法来做这件事。也许是某种树结构,让访问最少的一个保持在顶部


在Java中已经有这样的数据结构的实现了吗?

编辑:LinkedHashMap为此提供了内置功能,请参见另一个答案

您可以包装LinkedHashSet(或LinkedHashMap,具体取决于您的用例)并在access上重新插入项,将它们移动到末尾。如果内存不足,请从前面开始删除

class LruMap<K, V> {
  LinkedHashMap<K, V> map = new LinkedHashMap<>()

  V get(K key) {
    V result = map.remove(key);
    map.put(key, result);
    return result;
  }

  void put(K key, V value) {
    map.put(key, value);
  }

  void removeEldest() {
    if (map.size() > 0) {
      map.remove(map.keySet().iterator().next());
    }
  }
}
类LruMap{
LinkedHashMap=新建LinkedHashMap()
V get(K键){
V结果=映射。移除(键);
地图。放置(键、结果);
返回结果;
}
无效放置(K键,V值){
map.put(键、值);
}
无效重塑(){
如果(map.size()>0){
remove(map.keySet().iterator().next());
}
}
}

LinkedHashMap
是您所追求的结构。发件人:

提供了一个特殊的构造函数来创建一个链接的哈希映射,其迭代顺序是最后一次访问其条目的顺序,从最近一次访问到最近一次(访问顺序)。这种映射非常适合构建LRU缓存

因此,您只需使用:

用法:

Map<K, V> map = new Cache<>();
Map Map=new Cache();
番石榴缓存怎么样(假设您不必从头开始编写)。他们有一个基于大小的LRU策略,可以实现您想要的功能:或者Apache的LRUMap
public class Cache<K, V> extends LinkedHashMap<K, V> {

    private static final int MAX_ENTRIES = 100;

    public Cache() {
        super(SOME_INITIAL_CAPACITY, SOME_LOAD_FACTOR, true);
    }

    protected boolean removeEldestEntry(Entry<K, V> entry) {
        return size() > MAX_ENTRIES;
    }
}
Map<K, V> map = new Cache<>();