LruCache
之前分析过Lru算法的实现方式:HashMap+双向链表,参考链接:LRU算法&&LeetCode解题报告
这里主要介绍Android SDK中LruCache缓存算法的实现, 基于Android5.1版本源码.
GitHub
参考实现了LruCache缓存类,欢迎大家Fork使用.GitHub-LruCache
构造函数
LruCache只有一个构造函数,并且有一个必传参数:
public LruCache(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}
// 初始化最大缓存大小.
this.maxSize = maxSize;
// 初始化LinkedHashMap.其中:
// 1. initialCapacity, 初始大小.
// 2. loadFactor, 负载因子.
// 3. accessOrder, true:基于访问顺序排序, false:基于插入顺序排序.
this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
}
get方法
LruCache的get方法源码如下:
public final V get(K key) {
// lru的key不能为null
if (key == null) {
throw new NullPointerException("key == null");
}
V mapValue;
synchronized (this) {
// LinkedHashMap每次get会基于访问顺序重新排序
mapValue = map.get(key);
if (mapValue != null) {
// 命中,命中数+1,且返回命中数据
hitCount++;
return mapValue;
}
// 未命中数+1
missCount++;
}
// 一般LruCache类都不会重写create方法的,所以下面的逻辑不需要care.
V createdValue = create(key);
if (createdValue ==