LruCache是怎樣實現(xiàn)LRU算法的?

LruCache 內部使用 LinkedHashmap 存儲數(shù)據以實現(xiàn) LRU 算法。

LinkedHashmap 可以使用兩種模式初始化,當 accessOrderfalse 時,其中的元素按插入順序排序,為 true 時則按訪問順序排序。元素順序保存在 LinkedHashmap 內部另外維護的一個雙向鏈表中。

在訪問順序排序模式下,每次 get() 元素時,LinkedHashmap 都會把當前元素移動到鏈表的尾部,如此一來,排在鏈表前端的自然就是最近一次被訪問時間最遠(Least Recently Used)的元素了。

當 LruCache 執(zhí)行 trim 時,逐個取出 LinkedHashmap 中最 eldest() 的元素并移除,直到指定 size 就可以了。

trim策略?

  1. 每次 put(K, V)
  2. create 方法(用于預先創(chuàng)建緩存值)被重寫,其返回的對象被首次放置到 LinkedHashmap 中時
  3. resize(maxSize) 被調用,重新分配緩存大小時
  4. evictAll() 被調用,釋放所有緩存時w

雙向鏈表?

LinkedHashmap 中額外維護了一個 LinkedEntry ,繼承自 Hashmap 中的 HashmapEntry ,并額外添加了 nxtprv 兩個指針屬性以實現(xiàn)正反雙向查找。頭尾兩端元素的 prvnxt 互相指向對方,使得整個雙向鏈表頭尾相接。

一句話總結

Q: LruCache 怎樣實現(xiàn)了 LRU 算法?

A: 它用于存儲數(shù)據的 LinkedHashmap 使用了 LRU 方式來排列元素

怎么看著像廢話(

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容