zoukankan      html  css  js  c++  java
  • LruCache

     
    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}}

  • 相关阅读:
    算法-最大公约数
    算法-最大连续子序列和
    iOS开发-Bug锦囊
    iOS开发-简单抽奖
    iOS开发-UIActionSheet简单介绍
    iOS开发-UIActivityIndicatorView简单使用
    iOS开发-UITextView实现PlaceHolder的方式
    iOS开发-Reachability实时检测Wifi,2G/3G/4G/网络状态
    [转]jsPlumb插件做一个模仿viso的可拖拉流程图
    Python 日期和时间
  • 原文地址:https://www.cnblogs.com/tonggc1668/p/11925214.html
Copyright © 2011-2022 走看看