声明:
本文为读完
https://www.cnblogs.com/liuling/archive/2015/09/24/2015-9-24-1.html帖子后,对照android源码写出的自己的理解,如有侵犯他人版权,请留言联系本人删除。
原理:
LruCache(Last Recently Used Cache),顾名思义,按照使用频率进行排序的缓存。实现方式采用双向链表(LinkedHashMap),获取或存入时,把最新操作的缓存都放入链表尾端,使尾部为最近使用缓存,首部为相对不常用缓存。每次新放入缓存时,都去判断当前缓存大小是否超过设定的缓存最大值,如果超出,则循环删除首端缓存,直到缓存大小不大于最大值为止。
源码变量及函数整理
LruCache{
private final
LinkedHashMap<
K
,
V
>
map
;
private int
size
; //当前cache的大小
private int
maxSize
; //cache最大大小
private int
putCount
; //存入次数
private int
createCount
; //创建次数
private int
evictionCount
; //回收次数
private int
hitCount
; //命中次数
private int
missCount
; //未命中次数
//传入缓存最大个数,创建一个LinkedHashMap
public
LruCache(
int
maxSize);
//把缓存的最大大小赋值成传入值,然后按照这个值清理缓存(trimToSize)。
public void
resize(
int
maxSize);
/**
* 如果缓存中有的话,获取返回内容,如果缓存中没有,执行创建函数,创建函数如果不重写默认返回空
* 如果重写了,则创建,加入缓存,变更当前缓存大小,缓存最大值为不变,重新整理缓存。
*/
public final
V
get(
K
key);
//放入缓存列表,变更当前缓存大小,缓存最大值不变,整理缓存。
public final
V
put(
K
key,
V
value);
/**
*整理缓存的大小,传入目标整理最大值(整理后最大值),把原有的不常用的缓存删掉,直到缓存大小小于或
*等于传入的maxSize停止清理。
*/
public void
trimToSize(
int
maxSize);
//删除缓存内容,变更当前缓存大小,不整理缓存。
public final
V
remove(
K
key);
protected void
entryRemoved(
boolean
evicted,
K
key,
V
oldValue,
V
newValue);
protected
V
create(
K
key) {
return null
;}
private int
safeSizeOf(
K
key,
V
value);
protected int
sizeOf(
K
key,
V
value){
return
1;};
public final void
evictAll(){trimToSize(-
1
);}
public synchronized final int
size(){
return
size
;}
public synchronized final int
maxSize(){
return
maxSize
;}
public synchronized final int
hitCount(){
return
hitCount
;}
public synchronized final int
missCount(){
return
missCount;
};
public synchronized final int
createCount(){
return
createCount
;}
public synchronized final int
putCount(){
return
putCount
;}
public synchronized final int
evictionCount
(){
return
evictionCount
;}
public synchronized final
Map<
K
,
V
> snapshot(){
return new
LinkedHashMap<
K
,
V
>(
map
);}
}