美文网首页
LruCache源码

LruCache源码

作者: littleGrow | 来源:发表于2018-11-02 10:35 被阅读0次

在Android-27中查看LruCache源码(不要在Android-28中看,其中有些问题)

public LruCache(int maxSize) {

    if (maxSize <= 0) {

        throw new IllegalArgumentException("maxSize <= 0");

    }

    this.maxSize = maxSize;

    this.map = new LinkedHashMap<K, V>(0, 0.75f, true);

}

从构造函数中可以看出其内部的实现是LinkedHashMap并将LinkedHashMap中的accessOrder设置为true,accessOrder的作用参考文章:LinkedHashMap中的accessOrder - 简书

其中maxSize是在缓存中可以存放的最大数量,一般使用时结合sizeOf方法,sizeOf方法的默认实现如下:

protected int sizeOf(K key, V value) {

    return 1;

}

可以结合项目需要看是否重写该方法。

在使用时常用的是put,get方法,下面我们来看看这两个方法的实现:

图1

在图1的put方法中,我们可以看出其内部调用的是LinkedHashMap的put方法,如果key已经存在,就是相当于修改原有的值,则size保持不变,否则size加上sizeOf的返回值。其中LinkedHashMap的源码可以参考文章:HashMap源码 - 简书

接下来,我们查看entryRemoved方法和trimToSize方法:

protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {}

entryRemoved方法在LruCache中什么也没有处理,这个方法的作用就是每次我们从缓存中将最近最久未使用的移除缓存时调用的方法,我们可以利用此方法对移除缓存的数据做处理。其中evicted表示该key-value是否移除(true移除)

图2

在图2的trimToSize方法中,我们可以看到size会和我们设置的maxSize进行比较,并不断移除LinkedHashMap中的最近最久未使用的(即头部节点),直到size<=maxSize,从而来保证缓存的大小不超过我们设置的缓存最大值。

图3

在图3的get方法中,可以看到内部调用的是LinkedHashMap的get方法,在LinkedHashMap源码中可以看到每一次调用get方法获取到key对应的值,就会调整该Node的before和after,其实并没有改变该Node的实际存储位置,只不过改变了该Node获取的顺序。听起来有些绕口,需要你去看HashMap和LinkedHashMap的源码就会理解。简单说为了能够按照put数据的顺序取出数据,在LinkedHashMap中引入了头部节点和尾部节点,并在节点中多保存了它对应的前一个节点和后一个节点。在LinkedHashMap中调用get方法时便将该Node放到尾部节点,从而使得最近最久未使用的节点在头部节点。

相关文章

  • LruCache

    LruCache的使用 LruCache部分源码解析 LruCache 利用 LinkedHashMap 的一个特...

  • Android-Glide源码解析

    一、LruCache 要分析Glide的源码,首先就需要分析LruCache。LruCache是基于LinkedH...

  • Glide解析(一) - LruCache

    本文介绍的内容有 LruCache算法思想介绍 v4包中LruCache中源码解析 LruCache算法思想介绍 ...

  • Rocksdb(LevelDB) LRU 实现

    [TOC] 参考 leveldb中的LRUCache设计 LevelDB-LruCache源码学习 1. 前言 l...

  • LruCache之LruCache分析

    LruCache 分析 LruCache 是 Android 的一个内部类,提供了基于内存实现的缓存 用法 源码 ...

  • LruCache源码

    在Android-27中查看LruCache源码(不要在Android-28中看,其中有些问题) public L...

  • LruCache

    文章主要介绍了:1.LruCache的基本使用2.LruCache的源码分析3.基于LinkedHashMap的实...

  • Android基础(41)图片加载框架

    1)图片库对比2)Glide源码解析3)图片框架缓存实现4)LRUCache原理。LruCache默认缓存大小5)...

  • LruCache缓存类源码解析

    LruCache源码解析 LruCache是Android中的一个缓存工具类,它采用了一种最近最少使用算法,可以将...

  • 一日一学_LruCache(源码解读)

    在学习LruCache源码之前,我们有必要简单了解LinkedHashMap(使用): LinkedHashMap...

网友评论

      本文标题:LruCache源码

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