import java.util.LinkedHashMap;
import java.util.Map;

public class LruCache2 extends LinkedHashMap{

private int cap;

public LruCache2(int cap){
super(16, 0.75f,true);
this.cap = cap;
}

@Override
public boolean removeEldestEntry(Map.Entry eldestEntry){
return size() > cap;
}

public static void main(String[] args) {
LruCache2 cache = new LruCache2(2);
cache.put(1,1);
cache.put(2,2);
cache.put(3,3);
cache.put(4,4);
cache.put(5,5);
cache.put(6,6);
System.out.println(cache.get(1));
System.out.println(cache.get(2));
System.out.println(cache.get(3));
System.out.println(cache.get(4));
System.out.println(cache.get(5));
System.out.println(cache.get(6));
System.out.println(cache.size());
}
}


null

null

null

null

5

6

2



import java.util.HashMap;
import java.util.Map;

public class LruCache<K, V> {

public Map<K, Node> getMap() {
return map;
}

private Map<K, Node> map;
private Node<K, V> head;
private Node<K, V> tail;
private int cacheSize;

public LruCache(int cacheSize) {
if (cacheSize < 1) throw new IllegalArgumentException();
this.cacheSize = cacheSize;
map = new HashMap<>();
}


static class Node<K, V> {
K key;
V value;
Node<K, V> prev;
Node<K, V> next;

Node( K key, V value, Node<K, V> prev, Node<K, V> next) {
this.key = key;
this.value = value;
this.prev = prev;
this.next = next;
}

@Override
public String toString() {
return "Node{" +
"key=" + key.toString() +
", value=" + value.toString() +
'}';
}
}

public V get(K key) {
Node<K, V> e, last, before, after;
e = map.get(key);
if (e == null) {
return null;
}
if ((last = tail) != e) {
before = e.prev;
after = e.next;
if (before != null) {
before.next =after;
}
if (after != null) {
after.prev = before;
}
last.next = e;
tail =e;
}
return e.value;
}


public void put(K key, V value) {
Node<K, V> e, last, first, second;
if ((last = tail) != null) {
e = new Node<>(key ,value, last, null);
last.next = e;
tail = e;
} else {
head = tail = e = new Node<K, V>(key, value, null, null);
}
map.put(key, e);
if ( map.size() > cacheSize && (first = head) != null && (second = first.next) != null) {
second.prev = null;
head = second;
map.remove(first.key);
}
}

public static void main(String[] args) {
LruCache cache = new LruCache(1);
cache.put(1, 1);
cache.put(2, 2);
System.out.println(cache.get(1));
System.out.println(cache.get(2));
System.out.println(cache.get(3));
System.out.println(cache.getMap());
}
}


null

2

null

{2=Node{key=2, value=2}}