手写LRU算法

package com.study;

import java.util.HashMap;

/***
 * 底层HashMap + 各个node用指针连接起来,将最新加入或者最新访问的node放在队列的右端,这样队列左端将是最“老”的node,内存不够时,从最左端淘汰元素。
 * @author: 码出地球
 */
public class LRUCache<K, V> {

    private HashMap<K,Node> cache = new HashMap<>();

    Node left = new Node();
    Node right = new Node();

    public LRUCache(){
        this.left.next = right;
        this.right.pre = left;
    }

    class Node{
        V value;
        Node pre;
        Node next;

        public Node(){}

        public Node(V value){
            this.value = value;
        }
    }

    /***
     * 新添加的node放在队列的最右边
     * 左 <=> node1 <=> node2 <=> node3 <=> 右
     *
     * 左 <=> node1 <=> node2 <=> newNode <=> 右
     * @param key
     * @param value
     * @description:
     * 这里只简单的处理了put新元素,当key存在时覆盖,且移到最右端的没有实现 ||_||
     */
    public void put(K key, V value){
        Node node = new Node(value);

        Node temp = right.pre;

        temp.next = node;
        node.next = right;
        node.pre = temp;
        right.pre = node;

        cache.put(key, node);
    }

    /***
     * 例如node1被访问,移到队列的最右边
     * 左 <=> node1 <=> node2 <=> node3 <=> 右
     *
     * 左 <=> node2 <=> node3 <=> node1 <=> 右
     * @param key
     */
    public Node get(K key){
        Node node = cache.get(key);

        node.pre.next = node.next;
        node.next.pre = node.pre;


        Node temp = right.pre;

        temp.next = node;
        node.next = right;
        node.pre = temp;
        right.pre = node;


        return node;
    }

    public String toString(){
        String result = "";

        Node flag = left.next;
        while (flag != null && flag != right){
            result += flag.value.toString() + " ";
            flag = flag.next;
        }

        return result;
    }
}

 

posted @ 2022-03-06 22:01  码出地球  阅读(43)  评论(0编辑  收藏  举报