本题关键思路:当访问一个key后,就移动该key到最前面的位置或者最后面的位置,那么另一端最后一个元素就是最近最久没有访问的元素。而LinkedHashMap就是可以按照访问顺序来移动元素。
class LRUCache {
int cap=0;
// HashMap<Integer,Integer> map=new HashMap<>();
LinkedHashMap<Integer,Integer> map=null;
//LinkedHashMap:有顺序的map 相当于hashmap+双向链表 三个参数cap 负载因子 是否按顺序排列
//当调用一次get访问元素后 那么该元素就会放到最后
public LRUCache(int capacity) {
//这一步是初始化容量 表示最多存几个元素 也就是几个key
//思路 通过一个hashmap来存放key
this.cap=capacity;
map=new LinkedHashMap<>(cap,0.75f,true); //对map进行初始化
}
public int get(int key) {
return map.getOrDefault(key,-1); //如果找到key 则返回对应的值 如果没找到则返回-1
}
public void put(int key, int value) {
//put key和对应的value值
//1.put元素首先要检查是否已经容量满了
if(map.containsKey(key)){ //表示重复元素直接覆盖
map.put(key,value);
return;
}
if(map.size()>=cap){//表示已经满了
//就要踢出使用得最少的
//LinkedHashMap的规则就是 当使用get方法后 会将get的key放到最后面 那么最前面的就是访问最少的
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
int minkey=entry.getKey();//第一个key就是最近访问最少的
//这里要注意put的元素是不是重复的 如果是重复元素则不需要删除
map.remove(minkey);
break;
}
}
//然后添加元素
map.put(key,value);
}
}