LRU:least recently used,最近最少使用
有两种实现方式,
一种是利用LinkedHashMap,比较简单
二是利用HashMap+链表,此种实现是完全自己实现,也是面试中需要手写的
第一种实现方式利用LinkedHashMap
public class LRUCache<k,v> extends LinkedHashMap<k,v>{
private static MAX_SIZE = 3;
public LRUCache<k,v>{
super(this.MAX_SIZE,0.75f,false);
}
public boolean removeEldestEntry(Map.Entry<k,v> eldest){
return this.MAX_VALUE <size();
}
}
第二种利用HashMap+链表
class LRUCache {
Map<Integer,LRUNode> map;
int capacity;
LRUNode head;
LRUNode tail;
public LRUCache(int capacity) {
this.capacity = capacity;
map = new HashMap<>()
}
public int get(int key) {
LRUNode node = map.get(key);
if(node != null){
remove(node,false);
setHead(node);
return node.value;
}
return -1;
}
public void put(int key, int value) {
LRUNode node = map.get(key);
if(node != null){
node.value = value;
remove(node,false);
}else{
node = new LRUNode(key,value);
if(map.size()>=this.capacity){
remove(tail,true);
}
map.put(key,node);
}
setHead(node);
}
void remove(LRUNode node,boolean flag){
if(node.next != null){
node.next.pre = node.pre;
}else{
tail= node.pre;
}
if(node.pre != null){
node.pre.next = node.next;
}else{
head = node.next;
}
node.next = null;
node.pre = null;
if(flag){
map.remove(node.key);
}
}
void setHead(LRUNode node){
if(head != null){
node.next = head;
head.pre = node;
}
head = node;
if(tail == null){
tail = node;
}
}
class LRUNode{
int key;
int value;
LRUNode pre;
LRUNode next;
LRUNode(int key,int value){
this.key = key;
this.value = value;
}
}
}