【发布时间】:2020-06-20 18:02:57
【问题描述】:
我正在尝试使用 hashmap 和链表在 java 中实现 lru 缓存:
public static class LRUCache{
LinkedList<Integer> ll;
HashMap<Integer, Integer> map;
//HashSet<Integer> map;
int size;
LRUCache(int n){
ll = new LinkedList<>();
map = new HashMap<>();
size=n;
}
int refer(int page){
if(map.containsKey(page)){
Integer it = map.get(page);
//System.out.println("m.get(page)= " + map.get(page));
//System.out.println(it + " it+page " + page);
ll.remove(it);
} else{
if(map.size() >= size){
map.remove(ll.getLast());
ll.removeLast();
}
}
ll.addFirst(page);
//System.out.println(page + " page+peek " + ll.peekFirst());
map.put(page, ll.peekFirst());
return page;
}
}
在上面的引用函数中,对于在地图中找到页面的 if 条件,该值已成功从链接列表中删除,我认为这不应该起作用,因为我只在地图中保留页面值。 现在有趣的是,当我把 ll.remove(page);在上面的代码中,尽管页面的值和它相同,但它会中断。
int refer(int page){
if(map.containsKey(page)){
Integer it = map.get(page);
//System.out.println("m.get(page)= " + map.get(page));
//System.out.println(it + " it+page " + page);
ll.remove(page);
} else{
if(map.size() >= size){
map.remove(ll.getLast());
ll.removeLast();
}
}
ll.addFirst(page);
//System.out.println(page + " page+peek " + ll.peekFirst());
map.put(page, ll.peekFirst());`enter code here`
return page;
}
我对这种行为感到非常惊讶。
对于下面的测试用例,代码的第一个价格有效,第二个无效,唯一的区别是 ll.remove(it) 和 ll.remove(page) ,它和 page 的值是一样的。
void printCache(){
System.out.print("| ");
for(int i=0;i<ll.size();i++){
System.out.print(ll.get(i) + " |" + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
LRUCache lruCache = new LRUCache(4);
lruCache.refer(11);
lruCache.refer(12);
lruCache.refer(13);
lruCache.printCache();
lruCache.refer(11);
lruCache.printCache();
lruCache.refer(14);
lruCache.printCache();
lruCache.refer(13);
lruCache.printCache();
lruCache.refer(15);
lruCache.printCache();
}
【问题讨论】:
-
不是答案,但可能会为您节省大量调试此类问题的时间,您知道
LinkedHashMap吗? -
直奔问题:我发现很难理解问题所在。您能否添加一个示例来解释您预期会发生什么以及您实际得到了什么?
-
我的问题是为什么第一段代码有效,为什么第二段代码无效,即使 ll.remove() 函数在两种情况下都获得相同的值。是的 LinkedHashMap 是要走的路,但我需要知道在上述情况下发生了什么。
-
你能举一个具体的例子,一个代码成功,另一个代码失败?
-
用一个例子更新了问题来测试它。
标签: java intellij-idea data-structures lru