• 基于LinkedhashMap实现的LRU算法


    LRU全称是Least Recently Used,即最近最久未使用的意思。
    LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
    解决的实际问题:当做数据缓存时,缓存的数据会随着时间的推移越来越多,如果没有缓存清除策略,那么会出现俩个问题:1、缓存越来越大挤爆内存。2、很多不使用的数据占据这内存空间,导致内存得不到有效利用。
    此场景使用LRU算法非常合适。
    LRU算法的主要思想:

      1.设置一个缓存阈值,超过阈值删除最老的数据。

      2.保证最老的数据总是在链表的头部,最新的数据总是在尾部,这样每次需要删除数据时把头部数据删除即可。

    linkedHashMap对LRU算法的实现:

    import java.util.LinkedHashMap;
    import java.util.Map;
    
    public class LRU<K,V> extends LinkedHashMap<K, V> implements Map<K, V>{
    
       // private static final long serialVersionUID = 1L;
    
        public LRU(int initialCapacity,
                 float loadFactor,
                            boolean accessOrder) {
            super(initialCapacity, loadFactor, accessOrder);
        }
    
        /** 
         * @description 重写LinkedHashMap中的removeEldestEntry方法,当LRU中元素多余6个时,
         *              删除最不经常使用的元素
         * @author daoshao       
         * @param eldest
         * @return     
         * @see java.util.LinkedHashMap#removeEldestEntry(java.util.Map.Entry)     
         */  
        @Override
        protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
            // TODO Auto-generated method stub
            if(size() > 6){
                return true;
            }
            return false;
        }
    
        public static void main(String[] args) {
    
            LRU<Character, Integer> lru = new LRU<Character, Integer>(
                    16, 0.75f, true);
    
            String s = "abcdefghijkl";
            for (int i = 0; i < s.length(); i++) {
                lru.put(s.charAt(i), i);
            }
            System.out.println("LRU中key为h的Entry的值为: " + lru.get('h'));
            System.out.println("LRU的大小 :" + lru.size());
            System.out.println("LRU :" + lru);
        }
    }

     

  • 相关阅读:
    设计模式学习总结:(7)工厂方法模式和抽象工厂模式
    设计模式学习总结:(6)桥模式
    设计模式学习总结:(5)装饰模式
    设计模式学习总结:(4)观察者模式
    设计模式学习总结:(3)策略模式
    设计模式学习总结:(2)模板方法模式
    [算法总结]DFS(深度优先搜索)
    [总结]拓扑排序
    [总结]树与图的遍历
    [算法总结]康托展开Cantor Expansion
  • 原文地址:https://www.cnblogs.com/Young111/p/11470856.html
Copyright © 2020-2023  润新知