LruCache 实现原理

作者: 天晴雨依旧 | 来源:发表于2017-08-07 17:37 被阅读47次

            LruCache 是Android 提供的一个缓存工具类,LRU(Least Recently Used)  最近最少使用 ,也就是在当 我们缓存的数据到达预设的最大值之后 会删除掉 最近时间中最少使用的数据。

            LruCache 内部实现使用的LinkedHashMap。

            LinkedHashMap可以按插入顺序排序,也就是当我们遍历LinkedHashMap的时,元素的输出顺序和插入顺序是一致的,相较于HashMap 是无序的(HashMap 按key值的hashcode值排序)。但这里我们说一下  LinkedHashMap 的另一种排序方式 按访问顺序排序。

          这里 构造LinkedHashMap 时 使用了三个参数,其中0 为初始化容量为0,0.75f 可以理解为加载因子,当容量到达最大容量的75%时,会把内存增加一半,最后true表示排序方式为 按访问顺序,false 为按插入顺序。 

     看下我们测试结果:

    1.按插入顺序排序

    public void test() {       

            LinkedHashMapmap=newLinkedHashMap<(0,0.75f,false);

            map.put("test1",0);

            map.put("test2",1);

            map.put("test3",2);

            for(Map.Entry entry :map.entrySet()) {     

                  Log.e("tag", entry.getValue()+" ");     

            } 

    }

    打印结果是 1 2 3 

    2.按访问顺序排序:

    public void test() {

    LinkedHashMapmap=newLinkedHashMap<(0,0.75f,false);

    map.put("test1",0);

    map.put("test2",1);

    map.put("test3",2);

    map.get("test2");

    for(Map.Entryentry :map.entrySet()) {

    Log.e("tag", entry.getValue()+" ");

    }

    }

    打印结果是 0 2 1

            当以访问顺序排序的时候,访问过的数据会被放到集合的最后面。LruCache 也就使用了这个原理,最近访问的数据会被放到集合的后面,如果数据到达预设值,会移除集合中前面的数据。

     我们可以看下 put方法的源码:

    put方法中调用了trimToSize,trimToSize中是一个死循环,每次循环没将集合中的第一个元素remove掉,这个元素就是 最近最少使用的,直到this.size <= maxSize时才会结束循。

    另外,我们要注意一点LruCache使用的是强引用,HashMap存储特点,put进入map数据会被强引用。

    有兴趣的同学可以看下 DiskLruCache硬盘缓存

    相关文章

      网友评论

        本文标题:LruCache 实现原理

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