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