LruCache 实现原理

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

        LruCache 内部实现使用的LinkedHashMap。

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

LruCache 实现原理_第1张图片

      这里 构造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方法的源码:

LruCache 实现原理_第2张图片

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

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

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

你可能感兴趣的:(LruCache 实现原理)