Java实现LRU算法

本文介绍了LRU(最近最少使用)算法及其在计算机操作系统中的应用。详细讲解了在Java中实现LRU缓存的两种方法:一是利用HashMap结合双向链表,二是直接使用内置的LinkedHashMap。通过示例代码展示了具体实现过程,并验证了正确性。

LRU算法

LRU(Least recently used)—最近最少被使用算法。在一些内存算法表现中若在一个内存有限的环境中,出现内存不足时为了保证程序的正常运行,会将一些价值较低的对象(如何来评定一个对象的价值的高低,对于LRU算法来说:如果数据最近被访问过,那么将来被访问的几率也更高,那么对应的价值就越高)进行清除,空出内存空间。

计算机操作系统基础理论中有一个经典理论:最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。

2:LRU算法应用实现

在缓存应用中,使用LRU算法可以保证缓存数据量的可控,一旦缓存数据总量超过指定阀值,就将最近最少被访问的数据给清除掉。下面的具体的实现都基于cache需求来实现

2.1:Java中cache的实现(HashMap+双向链表实现)

实现思路:使用HashMap中value存储双向链表的各个节点,双向链表按照数据写入顺序的数据存储,一旦任意数据被访问,获取HashMap中该数据所在节点,将此节点移动到head(表示该数据最近被访问到),重新连接该节点上下节点。最终经常访问的数据会在双向链表前端聚齐,而不经常被访问的数据会聚集在链表尾部,一旦出现数据总量超过阀值时,我们可以通过将尾部的数据直接移除,来保证整个缓存的健康。

这里为何选用HashMap+双向链表来实现:

  1. HashMap的k,v结构对应这cache中k,v的概念,所以使用HashMap中V存储双向链表中的Node
  2. HashMap中查询写入的时间复杂度为O(1)
  3. 双向链表中的节点的移动,删除的时间复杂度为O(1)。
  4. 双向链表可以使我们通过任意一个节点获取其它所有节点

源码:

/**
 * 基于HashMap+双向链表
 * @author fangyuan
 */
public class MyLRUCache<K,V> {

    /**
     * 用于存储所有节点数据【利用HashMap中读写为O(1)特性】可以快速获取节点
     */
    private HashMap<K,Node<K,V>> nodes;

    /**
     * 用于存储双向链表头
     */
    private Node<K, V> head;

    /**
     * 用于存储双向链尾
     */
    private Node<K, V> tail;

    /**
     * 缓存中最大数据深度
     */
    private Integer maxSize;


    public MyLRUCache(Integer maxSize){

        if( ( maxSize =(maxSize ==null ? 16:maxSize))<6){

            throw new RuntimeExcept
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值