基于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);
    }
}

 

 

posted on 2019-09-06 08:28  菜鸟小于  阅读(699)  评论(0编辑  收藏  举报