LRU JAVA两种常见的实现

import java.util.*;

public class LruTest {
    public static void main(int[] args) {

    }
}

    class Node{
        Node pre;
        Node next;
    //    Map.Entry<int,int> data;
        int key;
        int value;
        Node(){
            pre = next = null;
             key = -1;
             value =-1;

        }
        Node(int key,int value){
            this.value = value;
               this.key = key;
        }

    }

/**
 * 双向链表 + hashmap实现
 */
    class LRUCache{
        Node head;
        Node tail;
        int capity ;

        Map<Integer,Node> map = new HashMap();
        LRUCache(int capity) {
            head = new Node();
            tail = new Node();
            head.next = tail;
            tail.pre = head;
            this.capity = capity;
       }

        int get(int key){
    //        if(capity == 0) return  -1;
            int value;
            if(! map.containsKey(key)) return -1;
                else {
                value = map.get(key).value;
                remove(key);
                add(key,value);
              }
             return value;
        }



        boolean put(int key,int value) {

             if (map.containsKey(key)) {
                            remove(key);
                            add(key,value);
                return true;
             }

                add(key,value);
            if(map.size() > capity){
                remove(tail.pre.key);
            }

            return true;

        }


        void add(int key,int value){
            Node node  = new Node(key,value);

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

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

            map.put(key,node);
        }

        void remove(int key){
          Node node = map.get(key);

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

              node.next = null;
              node.pre = null;
            map.remove(key);
        }
    }

/**
 * LinkedHashMap实现
 */

   class LRUCache1{
       int capity;
       LinkedHashMap<Integer,Integer> linkedHashMap = new LinkedHashMap();

      LRUCache1(int capity) {
          this.capity = capity;
      }

       int get(int key){
       if(!linkedHashMap.containsKey(key)) return -1;
          int value = linkedHashMap.get(key);
                remove(key);
                 add(key,value);
            return  value;
       }

       void put(int key, int value){
           if(linkedHashMap.containsKey(key)){
               remove(key);
               add(key,value);
           }
            else{
                    add(key,value);
           }
            if(linkedHashMap.size() > capity) linkedHashMap.remove(linkedHashMap.entrySet().iterator().next().getKey());
       }


       void add(int key, int value){
           linkedHashMap.put(key,value);
       }
       void remove(int key){
           linkedHashMap.remove(key);
       }

    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值