LruCache 內(nèi)部使用 LinkedHashmap
存儲數(shù)據(jù)以實現(xiàn) LRU 算法。
LinkedHashmap 可以使用兩種模式初始化,當(dāng) accessOrder
為 false
時,其中的元素按插入順序排序,為 true
時則按訪問順序排序。元素順序保存在 LinkedHashmap 內(nèi)部另外維護(hù)的一個雙向鏈表中曲稼。
在訪問順序排序模式下窄坦,每次 get()
元素時肠缨,LinkedHashmap 都會把當(dāng)前元素移動到鏈表的尾部,如此一來,排在鏈表前端的自然就是最近一次被訪問時間最遠(yuǎn)(Least Recently Used)的元素了。
當(dāng) LruCache 執(zhí)行 trim 時晃择,逐個取出 LinkedHashmap 中最 eldest()
的元素并移除焦除,直到指定 size
就可以了。
trim策略?
- 每次
put(K, V)
時 - 當(dāng)
create
方法(用于預(yù)先創(chuàng)建緩存值)被重寫胰舆,其返回的對象被首次放置到 LinkedHashmap 中時 -
resize(maxSize)
被調(diào)用倦零,重新分配緩存大小時 -
evictAll()
被調(diào)用葫隙,釋放所有緩存時w
雙向鏈表钙态?
LinkedHashmap
中額外維護(hù)了一個 LinkedEntry
,繼承自 Hashmap
中的 HashmapEntry
,并額外添加了 nxt
和 prv
兩個指針屬性以實現(xiàn)正反雙向查找。頭尾兩端元素的 prv
和 nxt
互相指向?qū)Ψ剑沟谜麄€雙向鏈表頭尾相接。
一句話總結(jié)
Q: LruCache 怎樣實現(xiàn)了 LRU 算法?
A: 它用于存儲數(shù)據(jù)的 LinkedHashmap 使用了 LRU 方式來排列元素