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
类中的大多数代码(例如,justreturn map.getOrDefault(键,-1);
forget
)但应该注意的是,使用将更简单,更清洁,比这种删除和重新插入混泥土…