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硬盘缓存
网友评论