LruCache

LruCache

LruCache 是 Android 中基于 LRU(最近最少使用)算法实现的缓存类。

LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用存储在LinkedHashMap中。当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作。

关键原理:LinkedHashMap(数组+双向链表结构)初始化参数accessOrder=true实现访问顺序排序,然后LruCache可方便地删除最近最少使用的对象

accessOrder=false: 插入顺序排序
accessOrder=true: 访问顺序排序

调用put()时,会在map中添加数据,并调用trimToSize():判断缓存是否已满。如果满了就用LinkedHashMap的迭代器删除队尾元素,即近期最少访问的元素。当调用get()方法访问缓存对象时,就会调用LinkedHashMap的get)方法获得对应集合元素,同时会更新该元素到队头。

LruCache 源码分析

LruCache 是 Android 中基于 LRU(最近最少使用)算法实现的缓存类。下面是 LruCache 的核心源码分析:

📁 核心数据结构

LruCache 内部使用 LinkedHashMap 作为存储容器,这是实现 LRU 算法的关键:

public class LruCache<K, V> {
    // 核心数据结构:LinkedHashMap
    private final LinkedHashMap<K, V> map;
    
    // 当前缓存大小(通常指条目数,但可自定义计算方式)
    private int size;
    private int maxSize;  // 缓存最大容量
    
    // 统计信息
    private int putCount;      // put操作次数
    private int createCount;   // create调用次数
    private int evictionCount; // 淘汰条目次数
    private int hitCount;      // 缓存命中次数
    private int missCount;     // 缓存未命中次数
}

🔧 关键源码分析

1. 构造方法

关键点LinkedHashMap的第三个构造参数 accessOrder设置为 true,表示按访问顺序排序(最近访问的放在队尾),这是 LRU 算法的核心。

2. put() 方法 - 添加缓存

3. get() 方法 - 获取缓存

LRU关键机制:调用 map.get(key)时,由于创建 LinkedHashMap时设置了 accessOrder=true,被访问的条目会自动移到链表尾部(最近使用),而链表头部就是最近最少使用的条目。

4. trimToSize() 方法 - 核心淘汰逻辑

淘汰策略:当缓存大小超过 maxSize时,循环移除链表头部的条目(最近最少使用),直到满足大小限制。

5. remove() 方法 - 移除缓存

📊 自定义大小计算

LruCache 默认按条目数计算大小,但可以通过重写 sizeOf()方法自定义计算逻辑:

自定义示例

🔄 生命周期回调

LruCache 提供了可重写的回调方法,用于处理特定事件:

🎯 线程安全性

LruCache 的所有公共方法都通过 synchronized 关键字实现线程安全

Last updated