最近在學習glide原始碼用到了lrucache,lru (least recently used) 的意思就是近期最少使用演算法,它的核心思想就是會優先淘汰那些近期最少使用的快取物件。
//有序map,此處用到了基於訪問的排序
private final linkedhashmapmap;
//當前快取容量
private int size;
//最大快取容量
private int maxsize;
//put次數
private int putcount;
//子類重新create()方法有效,當根據key找不到對應的value,建立value的次數
private int createcount;
//**資源的次數
private int evictioncount;
//命中(根據key獲取到value)的次數
private int hitcount;
//錯誤(根據key找不到value)的次數
private int misscount;
這些是lrucache中定義的全域性變數,理解後這個類就變得非常易懂。
我們先來看一下構造方法,這裡包含了lrucache實現的主要原理
public lrucache(int maxsize) else
}
linkedhashmap
構造方法
public linkedhashmap(int initialcapacity,float loadfactor,boolean accessorder)
引數說明:
initialcapacity 初始容量大小,使用無參構造方法時,此值預設是16
loadfactor 載入因子,使用無參構造方法時,此值預設是 0.75f
accessorder false: 基於插入順序 true: 基於訪問順序
(最近訪問的value放在linkedhashmap的最後)
map.put()方法說明:
map裡的put方法,如果key值不存在,則返回值是null,
如果key存在,則會返回原先被替換掉的value值.(當
然map中的key和value都允許是null)
上面是我們的準備工作,下面列舉了兩個關鍵的方法予以說明,都新增詳細的注釋
put():
public final v put(@nonnull k key, @nonnull v value)
}if (previous != null)
//重新計算混存大小,如果混存資料超出maxsize則刪除map頭部的value
this.trimtosize(this.maxsize);
return previous;
} else
}
get():
public final v get(@nonnull k key) else
//如果沒有拿到map中資料,那麼miss+1
++this.misscount;
}//呼叫子類建立value,
v createdvalue = this.create(key);
//lrucache中資料是null,所以會直接返回null
if (createdvalue == null) else else
}if (mapvalue != null) else }}
}
LruCache原始碼解析
在android中乙個應用程式占用的記憶體是有限的,而android中通常需要載入很多顯示給使用者,是很消耗記憶體的,稍微處理不好就很容易報oom異常。而且無論是從本地還是網路獲取,解析並載入進記憶體都是乙個耗時的過程,所以我們通常就會把一些常用的儲存在記憶體中,在使用的時候直接從記憶體中獲取,從而...
Java簡單了解LruCache原始碼
1.在lrucache的構造器中很明顯知道lrucache使用linkedhashmap,並且將accessorder設定為true。這樣在使用linkedhashmap的get 方法的時候就會使其雙鏈表重新進行排序,也就是將當前查詢的節點斷開,然後呼叫addbefore 方法重新將節點新增到雙鏈表...
Glide 原始碼解析 之 快取
glide 的快取型別有 2 種 記憶體快取 檔案快取 每種型別的快取又各有2級,共計 4 級快取 一級記憶體快取 activeresource 二級記憶體快取 lruresourcecache 一級檔案快取 二級檔案快取 通過hashmap weakreference實現 final mapact...