今天看了下LruCache类的实现 记录下学习笔记
LruCache (Least Recently Used) 近期最少使用的算法
int cacheSize = 4 * 1024 * 1024; // 4MiB
LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) {
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
这是LruCache类上面注释的用法示例
其实第一次看到这个类的疑惑是 怎么就实现了近期最少使用的功能?在哪里实现的? 原理是什么?
带着这个疑惑 去看了看实现发现只是个LinkedHashMap (小白数据结构很差)
原来这个算法的核心是LinkedHashMap这个数据结构实现的 LruCache在这个基础上包装了一层
new LinkedHashMap<K, V>(0, 0.75f, true);
第三个构造参数 accessOrder 决定了访问LinkedHashMap时候的排序方式
true for access-order 使用访问顺序排序 (就是LruCache算法)
false for insertion-order 使用插入顺序排序
在LruCache里面使用 trimToSize 方法控制容器的大小
但是实际去看源码的时候发现这个方法在寻找toEvict对象的时候有问题 根据注释说这个方法的寻找各个版本会有差异
查看http://androidxref.com/网站发现
寻找toEvict使用的是linkedHashMap的下面这个方法 注释写的也很明显
// Android-added: eldest(), for internal use in LRU caches
/**
* Returns the eldest entry in the map, or {@code null} if the map is empty.
* @hide
*/
public Map.Entry<K, V> eldest() {
return head;
}
到这里算是对LruCache有了更深的认识 😄