LRUCache概述
在开发android应用时,加载图片我们都会加上二级缓存,一级是内存缓存,二级是硬盘缓存。在内存缓存中我们一般采用SDK提供给我们的LRUCahce。
LRU(least recently uses最近最少使用)是一种页面置换算法,最近最少使用的被替换掉。LRU算法是以时间轴为依据进行替换,而不是使用频率为依据替换。
常用的页面置换算法还有:
LFU(least frequently used 最不经常使用)是以单位时间内使用频率为依据进行替换,使用频率低的被替换掉。
FIFO(first in fist out 先进先出)按顺序进行替换。
LRUCache实现原理
先看一下LruCache的构造方法
public LruCache(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}
this.maxSize = maxSize;
this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
}
可以看到LruCache内部维护了一个LinkedHashMap,LinkedHashMap继承自HashMap,所以我们先来研究下HashMap的实现原理。
HashMap的实现原理
还是先看下构造方法
public HashMap(int capacity) {
if (capacity < 0) {
throw new IllegalArgumentException("Capacity: " + capacity);
}
if (capacity == 0) {
@SuppressWarnings("unchecked")
HashMapEntry<K, V>[] tab = (HashMapEntry<K, V>[]) EMPTY_TABLE;
table = tab;
threshold = -1; // Forces first put() to replace EMPTY_TABLE
return;
}
if (capacity < MINIMUM_CAPACITY) {
capacity = MINIMUM_CAPACITY;
} else if (capacity > MAXIMUM_CAPACITY) {
capacity = MAXIMUM_CAPACITY;
} else {
capacity = Collections.roundUpToPowerOfTwo(capacity);
}
makeTable(capacity);
}
其中 Collections.roundUpToPowerOfTwo(capacity); 方法是得到一个不小于所给数的2^n的数,就是说假如传入参数10,那么返回不小于10的2的n次方数就是16。具体的可以看这里
看下makeTable 方法
private HashMapEntry<K, V>[] makeTable(int newCapacity) {
@SuppressWarnings("unchecked") HashMapEntry<K, V>[] newTable
= (HashMapEntry<K, V>[]) new HashMapEntry[newCapacity];
table = newTable;
threshold = (newCapacity >> 1) + (newCapacity >> 2); // 3/4 capacity
return newTable;
}
可以看到,HashMap的构造方法中生成了一个大小为2^n的HashMapEntry的数组。我们看下HashMapEntry 的结构
static class HashMapEntry<K, V> implements Entry<K, V> {
final K key;
V value;
final

本文详细解析了LRUCache的工作原理,包括其内部使用到的HashMap和LinkedHashMap的实现细节。LRUCache作为Android开发中的常用内存缓存,通过 LinkedHashMao 实现基于时间轴的替换策略。HashMap主要依赖于一个数组加链表的结构,通过hash值定位并高效查找。LinkedHashMap则在此基础上增加双向链表,用于维护插入顺序或访问顺序。当LRUCache达到最大容量时,最久未使用的条目会被淘汰。
最低0.47元/天 解锁文章
2037

被折叠的 条评论
为什么被折叠?



