lru
通过linkedhashmap,hash中的节点用双向指针连接着,表示插入的顺序。因此保存这个顺序就可以每次都去除最久未使用的那个。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
class LRUCache {
private int cap;
Map<Integer, Integer> map;
public LRUCache(int capacity) {
this.cap = capacity;
map = new LinkedHashMap<>();
}
public int get(int key) {
if(map.containsKey(key)) {
int value = map.get(key);
make_recent(key);
return value;
}
return -1;
}
public void put(int key, int value) {
if(map.containsKey(key)) {
map.put(key,value);
make_recent(key);
return;
}
if(map.size()>=this.cap) {
int oldkey = map.keySet().iterator().next();
map.remove(oldkey);
}
map.put(key,value);
return;
}
public void make_recent(int key) {
int val = map.get(key);
map.remove(key);
map.put(key, val);
}
}
|