美文网首页
Lru算法之LruCache

Lru算法之LruCache

作者: sunger | 来源:发表于2017-04-20 16:32 被阅读704次

Lru算法(Least recently used,最近最少使用),其思想核心是最新操作(添加、读取)的数据,使用频率最高。

算法原理

算法原理图

通常实现是通过链表结构实现

  • 链表头部写入数据
  • 如果当前缓存数量大于最大缓存书,则删除链表尾部数据
  • 读取缓存数据时将该数据移动到链表顶部

LruCache实现

内部数据结构

LruCache 内部创建一个LinkedHashMap永存存数缓存数据,为什么要使用这个类呢?

  • LinkedHashMap构造函数
    public LinkedHashMap(int initialCapacity, float loadFactor,boolean accessOrder)
    • initialCapacity 容量
    • loadFactor 容量不足时,扩容倍数
    • accessOrder false还是基于插入 顺寻排序ture基于访问顺序
      LruCache显然是基于访问顺序排序
  • 内部数据结构
    内部实现采用LinkedHashMapEntry实现双链表结构,可以记录添加顺序,新增数据添加到双链表的尾部

  • 添加和读取数据
    执行get和put方法的,条件满足是都会会调用this.recordAccess方法(LinkedHashMap重写了recordAccess方法),以保证访问顺序排序,会将数据插入或者移动到链表的尾部

  • 遍历顺序
    LinkedHashMap遍历顺序是从头到尾,这样可以保证删除最老的数据

好像与上面的原理图并不一样,不过是添加数据的时候添加到链表尾部,遍历的时候从尾到头遍历实际上效果还是一样的

核心代码

trimToSize是核心代码,详见注解

     public void trimToSize(int maxSize) {
        while (true) {
            K key;
            V value;
            synchronized (this) {
                //判断当前缓存是否为空
                if (size < 0 || (map.isEmpty() && size != 0)) {
                    throw new IllegalStateException(getClass().getName()
                            + ".sizeOf() is reporting inconsistent results!");
                }
                //如果当前缓存数量小于最大缓存数,跳出循环
                if (size <= maxSize || map.isEmpty()) {
                    break;
                }
                //当前缓存已缓存数量大于最大缓存数,遍历获取map中第一个
                Map.Entry<K, V> toEvict = map.entrySet().iterator().next();
                key = toEvict.getKey();
                value = toEvict.getValue();
                //删除缓存
                map.remove(key);
                size -= safeSizeOf(key, value);
                evictionCount++;
            }

            entryRemoved(true, key, value, null);
        }
    }

相关文章

  • LruCache

    LruCache 一. LRU算法简介 ​ LRU算法,全称Least Rencetly Used,就是最近最...

  • LRUCache 原理

    LruCache算法,又称为近期最少使用算法。 LruCache 中 Lru 算法的实现就是通过 LinkedHa...

  • LurCache算法

    LruCache的Lru指的是LeastRecentlyUsed,也就是近期最少使用算法。使用LruCache其实...

  • 如何封装一个图片加载库

    ①分级缓存,著名的LruCache算法,又称为近期最少使用算法。LruCache 中 Lru 算法的实现就是通过 ...

  • Android LruCache 缓存机制实现原理

    通过使用 LruCache, 查看 LinkedHashMap 源码, 分析 LRU 算法的具体实现细节. LRU...

  • 缓存分析

    LruCache与DiskLruCache 文章目录 一 Lru算法 二 LruCache原理分析2.1 写入缓存...

  • Java基础_LruCache工作原理

    本文主要从如下节点讲解 LRU算法简介 LruCache的简介 LruCache的代码实操 LruCache的原理...

  • Lru算法之LruCache

    Lru算法(Least recently used,最近最少使用),其思想核心是最新操作(添加、读取)的数据,使用...

  • DiskLruCache+LruCache

    LruCache保存中在运行内存 LruCache用法 LRU算法 DiskLruCache 磁盘缓存 需要导入第...

  • LruCache是怎样实现LRU算法的?

    LruCache 内部使用 LinkedHashmap 存储数据以实现 LRU 算法。 LinkedHashmap...

网友评论

      本文标题:Lru算法之LruCache

      本文链接:https://www.haomeiwen.com/subject/msimattx.html