LRU缓存实现(Java)

    xiaoxiao2022-07-07  192

    package practice; import java.util.HashMap; import java.util.Map; /** * 链表头,链表尾,map,size * 构造方法:初始化size,构建map,头尾赋空,头尾相连 * get: 判断是否包含key -> 得到key的Node -> 删除node -> 把Node添加到头部 -> 返回node.v * put: 判断是否存在key -> 存在,删除 -> 初始化新节点,put到map中,头插 -> 长度超出,移除尾节点 */ public class LRUTest<K, V> { Node head; Node tail; Map<K, Node> map; int maxSize; private class Node { Node pre; Node next; K k; V v; public Node(K k, V v) { this.k = k; this.v = v; } } public LRUTest(int maxSize) { this.maxSize = maxSize; map = new HashMap<>(maxSize * 4 / 3); head = new Node(null, null); tail = new Node(null, null); head.next = tail; tail.pre = head; } public V get(K k) { if (!map.containsKey(k)) { return null; } Node node = map.get(k); unlink(node); appendHead(node); return node.v; } public void put(K k, V v) { if (map.containsKey(k)) { unlink(map.get(k)); } //不存在 Node node = new Node(k, v); appendHead(node); map.put(k, node); if (map.size() > maxSize) { //长度超出,移除尾节点 K removeKey = removeTail(); map.remove(removeKey); } } public void unlink(Node node) { Node pre = node.pre; Node next = node.next; pre.next = next; next.pre = pre; node.pre = null; node.next = null; } public void appendHead(Node node) { Node headNext = head.next; head.next = node; node.pre = head; node.next = headNext; headNext.pre = node; } public K removeTail() { Node node = tail.pre; Node pre = node.pre; pre.next = tail; tail.pre = pre; node.pre = null; node.next = null; return node.k; } }

    使用哈希表存储节点。降低查找复杂度

    最新回复(0)