Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在下面的LRU实现的get方法中,map.remove()有什么用途?_Java_Lru - Fatal编程技术网

Java 在下面的LRU实现的get方法中,map.remove()有什么用途?

Java 在下面的LRU实现的get方法中,map.remove()有什么用途?,java,lru,Java,Lru,我正在学习LRU,并使用下面的代码片段来理解它的实现。请让我知道map.remove(key)方法调用在get(int key)中的作用。我们不能只使用map.put(key,value),它将更新map中的项作为键。我在代码下面引用。 class LRUMap<K, V> extends LinkedHashMap<K, V>{ private final int MAX_NUM; public LRUMap(int capacity) {


我正在学习LRU,并使用下面的代码片段来理解它的实现。请让我知道
map.remove(key)
方法调用在
get(int key)
中的作用。我们不能只使用
map.put(key,value)
,它将更新map中的项作为键。
我在代码下面引用。

class LRUMap<K, V> extends LinkedHashMap<K, V>{
    private final int MAX_NUM;
    public LRUMap(int capacity) {
        super(capacity);
        MAX_NUM = capacity;
    }
    protected boolean removeEldestEntry(Map.Entry eldest) {
       return /*true*/ size() > MAX_NUM;
    }
}
public class LRU {
    LRUMap<Integer, Integer> map;
    public LRU(int capacity) {
        map = new LRUMap<Integer, Integer>(capacity);
    }
    public int get(int key) {
        if (map == null || map.get(key) == null)
           return -1;
        int value = map.get(key);
        map.remove(key);
        map.put(key, value);
        return value;
    }
    public void set(int key, int value) {
        if (map == null) return;
        get(key);
        map.put(key, value);
    }
}
类LRUMap扩展LinkedHashMap{
私有最终整数最大值;
公共LRUMap(内部容量){
超级(容量);
最大数量=容量;
}
受保护的布尔重构(Map.Entry最早){
return/*true*/size()>MAX_NUM;
}
}
公共级LRU{
LRUMap地图;
公共LRU(内部容量){
map=新LRUMap(容量);
}
公共整数获取(整数密钥){
if(map==null | | map.get(key)==null)
返回-1;
int value=map.get(键);
地图。删除(键);
map.put(键、值);
返回值;
}
公共无效集(int键,int值){
if(map==null)返回;
获取(密钥);
map.put(键、值);
}
}

LRUMap
扩展了
LinkedHashMap
,它按照插入键的顺序维护
映射
项的链接列表(第一个键是添加到
映射
的第一个键)

在实现最近使用最少的数据结构时,需要知道最近使用最少的元素。当空间不足时,将首先删除该元素

现在,如果我们看看
LinkedHashMap
Javadoc:

此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,通常是将关键帧插入贴图的顺序(插入顺序)请注意,如果将关键点重新插入地图,则插入顺序不受影响。(如果调用m.put(k,v),当m.containsKey(k)将在调用前立即返回true时,将密钥k重新插入到映射m中。)

我们看到,调用
put(k,v)
以获取
Map
中已经存在的键不会影响插入顺序

因此,当您访问
映射
的某个键时,必须首先将其从
LinkedHashMap
中删除,然后重新添加,从而将其移动到链接列表的末尾,并有效地将其标记为最近使用的键(即最后插入的键)

请注意,
set()
方法也会调用
get()
,这意味着如果键已经在
Map
中,它也会将其移动到链表的末尾

当您使用
键时,它应成为最近使用的键。简单地更新它不会使其成为最近使用的,因为它不会更改基础
链接列表中的索引


因此,
移除
并将其放回原处。这样它就变成了最近的一个。

这是你的代码,还是从哪里来的?@ghostCat不,这不是我的code@GhostCat没关系,很简单,actually@Eugene要点是:如果这是某个库,那么看看相应的Javadoc可能会有所帮助。当您有更多详细信息时,更容易找到。如果要使用,您将有一个带有自动访问顺序的映射,并且可以删除
LRU
类中的大多数代码(例如,just
return map.getOrDefault(键,-1);
for
get
)但应该注意的是,使用将更简单,更清洁,比这种删除和重新插入混泥土…