LRU算法

LRU是Least Recently Used 的缩写,即“最近最少使用”,基于LRU算法实现的Cache机制简单地说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现就是将最老的数据删除。Java里面实现LRU缓存通常有两种选择,一种是使用LinkedHashMap,一种是自己设计数据结构,使用链表+HashMap方式。

LinkedHashMap自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据。

代码清单4-4所示示例是LinkedHashMap的一个构造函数,当参数accessOrder为true时,将会按照访问顺序排序,最后访问的放在最前,最早访问的放在后面。

代码清单4-4 LRU Cache的LinkedHashMap实现

public LinkedHashMap(int initialCapacity, float loadFactor, booleanaccessOrder) {

        super(initialCapacity, loadFactor);

        this.accessOrder = accessOrder;

}

代码清单4-5所示赛马是LinkedHashMap自带的判断方法,判断是否删除最老的元素方法,默认返回false,即不删除老数据,我们要做的就是重写这个方法,当满足一定条件时删除老数据。

代码清单4-5 重写删除方法

protected booleanremoveEldestEntry(Map.Entry<K,V> eldest) {

        return false;

}

采用inheritance方式实现比较简单,该方式实现了Map接口,在多线程环境使用时可以使用Collections.synchronizedMap()方法实现线程安全操作。

代码清单4-6 LRU缓存LinkedHashMap(inheritance)实现

importjava.util.LinkedHashMap;

import java.util.Map;

 

public classLRUCache2<K, V> extends LinkedHashMap<K, V> {

    private final int MAX_CACHE_SIZE;

 

    public LRUCache2(int cacheSize) {

        super((int) Math.ceil(cacheSize / 0.75)+ 1, 0.75f, true);

        MAX_CACHE_SIZE = cacheSize;

    }

 

    @

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值