手写LRU算法(java)

圣杰

关注

阅读 51

2022-02-07

LRU算法是根据LinkedHashMap实现的

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * redis的lru算法实现
 * lru算法是:删除最近最少使用,重点是使用最少
 */
//@Slf4j
public class LruUtils {
    private static final Logger log = LoggerFactory.getLogger(LruUtils.class);
//    Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);


    public Map<String, Integer> simple() {
        int initialCapacity = 10;//初始化容量
        float loadFactor = 0.75f;//加载因子,一般是 0.75f
        boolean accessOrder = true;//排序方式 false 基于插入顺序  true  基于访问顺序

        Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
        for (int i = 0; i < 10; i++) {
            map.put(String.valueOf(i), i);
        }
        //访问前顺序
        for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, Integer> next = it.next();
            log.info("linkedMap--before-->" + next.getKey());
        }

        //模拟访问
        map.get("5");

        //访问后数据
        for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, Integer> next = it.next();
            log.info("linkedMap--after-->" + next.getKey());
        }
        return map;
    }


    public static boolean lruUse() {

//        final int initialCapacity = 10;//初始化容量
        int initialCapacity = 16;//初始化容量
        float loadFactor = 0.75f;//加载因子,一般是 0.75f
        boolean accessOrder = true;//排序方式 false 基于插入顺序  true  基于访问顺序
        //Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
        Map<String, Integer> map = new LinkedHashMap(initialCapacity, loadFactor, accessOrder) {

            private static final long serialVersionUID = -538572218634978920L;

            @Override
            protected boolean removeEldestEntry(Entry eldest) {
                return size() > initialCapacity;
            }
        };
        for (int i = 0; i < 20; i++) {
            map.put(String.valueOf(i), i);
        }
        //访问前顺序
        for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, Integer> next = it.next();
            log.info("linkedMap--before-->" + next.getKey());
        }
        return true;
    }

    public static void main(String[] args) {
        lruUse();
    }
}

精彩评论(0)

0 0 举报