zoukankan      html  css  js  c++  java
  • LRU实现

    使用LinkedHashMap实现LRU

    方式一:

    import java.util.LinkedHashMap;
    import java.util.Map;
    
    public class LRUCache<K,V> extends LinkedHashMap<K,V>{
        private final int CACHE_SIZE;
        
        public LRUCache(int cacheSize) {
            super((int)Math.ceil(cacheSize/0.75), 0.75f, true);
            CACHE_SIZE = cacheSize;
        }
        
        @Override
        protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
            return size() > CACHE_SIZE;
        }
    }

    测试:

    import java.util.Map;
    
    public class LRUTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            LRUCache<Integer, String> lru = new LRUCache<>(10);
            for(int i=0; i<10; i++) {
                lru.put(i, "v="+i);
            }
            
            //最久访问的元素
            for(int i=0; i<10; i++) {
                lru.get(4);
            }
            
            for(int i=0; i<9; i++) {
                lru.get(5);
            }
            
            for(int i=0; i<8; i++) {
                lru.get(6);
            }
            
            for(int i=0; i<7; i++) {
                lru.get(3);
            }
            
            for(int i=0; i<6; i++) {
                lru.get(7);
            }
            for(int i=0; i<5; i++) {
                lru.get(8);
            }
            for(int i=0; i<4; i++) {
                lru.get(9);
            }
            for(int i=0; i<3; i++) {
                lru.get(2);
            }
            for(int i=0; i<2; i++) {
                lru.get(0);
            }
            //最近访问的元素
            for(int i=0; i<2; i++) {
                lru.get(1);
            }
            
            System.out.println("原始");
            for(Map.Entry<Integer, String> entry : lru.entrySet()) {
                System.out.print(entry.getValue() + " ");
            }
            
            lru.put(10,"v="+10);
            
            System.out.println("新增数据");
            for(Map.Entry<Integer, String> entry : lru.entrySet()) {
                System.out.print(entry.getValue() + " ");
            }
        }
    
    }

    输出: 

    原始
    v=4 v=5 v=6 v=3 v=7 v=8 v=9 v=2 v=0 v=1 
    新增数据
    v=5 v=6 v=3 v=7 v=8 v=9 v=2 v=0 v=1 v=10 

    方式二:

    import java.util.Collections;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    public class LRUCache1<K,V> {
        private final int CACHE_SIZE;
        private Map<K,V> cache = null;
        
        public LRUCache1(int cacheSize) {
            CACHE_SIZE = cacheSize;
            cache = Collections.synchronizedMap(new LinkedHashMap<K,V>((int) Math.ceil(cacheSize/0.75), 0.75f, true) {
                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;
    
                @Override
                protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
                    return size() > CACHE_SIZE;
                }
            });
            
        }
        
        public void put(K k,V v) {
            cache.put(k, v);
        }
        
        public V get(K k) {
            return cache.get(k);
        }
        
        public String toString() {
            StringBuilder sb = new StringBuilder();
            for(Map.Entry<K, V> entry : cache.entrySet()) {
                sb.append(entry.getValue() + " ");
            }
            return sb.toString();
        }
    }

    测试:

    public class LRUTest1 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            LRUCache1<Integer, String> lru = new LRUCache1<>(10);
            for(int i=0; i<10; i++) {
                lru.put(i, "v="+i);
            }
            
            //最久访问的元素
            for(int i=0; i<10; i++) {
                lru.get(4);
            }
            
            for(int i=0; i<9; i++) {
                lru.get(5);
            }
            
            for(int i=0; i<8; i++) {
                lru.get(6);
            }
            
            for(int i=0; i<7; i++) {
                lru.get(3);
            }
            
            for(int i=0; i<6; i++) {
                lru.get(7);
            }
            for(int i=0; i<5; i++) {
                lru.get(8);
            }
            for(int i=0; i<4; i++) {
                lru.get(9);
            }
            for(int i=0; i<3; i++) {
                lru.get(2);
            }
            for(int i=0; i<2; i++) {
                lru.get(0);
            }
            //最近访问的元素
            for(int i=0; i<2; i++) {
                lru.get(1);
            }
            
            System.out.println("原始");
            System.out.println(lru.toString());
            
            lru.put(10,"v="+10);
            
            System.out.println("新增数据");
            System.out.println(lru.toString());
        }
    
    }

    输出:

    原始
    v=4 v=5 v=6 v=3 v=7 v=8 v=9 v=2 v=0 v=1 
    新增数据
    v=5 v=6 v=3 v=7 v=8 v=9 v=2 v=0 v=1 v=10 

     参考:https://juejin.im/post/5dc3a9fbf265da4d3c072eab《我们一起进大厂》系列-Redis哨兵、持久化、主从、手撕LRU

  • 相关阅读:
    数组排序 -- 冒泡排序
    数组自带的函数(方法)
    京东官网轮播图的实现
    鼠标单击元素输出对应元素的索引号
    JavaScript中获取HTML元素的方式
    JavaScript数组的2种定义方式
    this关键字
    JavaScript中对象的3种定义方式
    Hadoop完整搭建过程(三):完全分布模式(虚拟机)
    Hadoop完整搭建过程(二):伪分布模式
  • 原文地址:https://www.cnblogs.com/shuimuzhushui/p/12516706.html
Copyright © 2011-2022 走看看