LruCache学习

今天看了下LruCache类的实现 记录下学习笔记
LruCache (Least Recently Used) 近期最少使用的算法

int cacheSize = 4 * 1024 * 1024; // 4MiB
LruCache bitmapCache = new LruCache(cacheSize) {
    protected int sizeOf(String key, Bitmap value) {
        return value.getByteCount();
    }

这是LruCache类上面注释的用法示例


其实第一次看到这个类的疑惑是 怎么就实现了近期最少使用的功能?在哪里实现的? 原理是什么?
带着这个疑惑 去看了看实现发现只是个LinkedHashMap (小白数据结构很差)
原来这个算法的核心是LinkedHashMap这个数据结构实现的 LruCache在这个基础上包装了一层

new LinkedHashMap(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 eldest() {
        return head;
    }

到这里算是对LruCache有了更深的认识

你可能感兴趣的:(LruCache学习)