LRU(Least Recently Used)最近最少使用,最近有時間和空間最近的歧義,所以我更喜歡叫它近期最少使用算法。它的核心思想是,如果一個數據被訪問過,我們有理由相信它在將來被訪問的概率就越高。于是當LRU緩存達到設定的最大值時將緩存中近期最少使用的對象移除。LRUCache內部使用LinkedHashMap來存儲key-value鍵值對,并將LinkedHashMap設置為訪問順序來體現LRU算法。
可以看到,除了初始化maxSize,還初始化了一個全局的LinkedHashMap,當第三個參數設為true時,map被設置為 訪問順序,也就是每操作一次map的某個Entry,它就會被放到雙向鏈表的隊尾。也就是說LRU算法的任務,完全交給了LinkedHashMap。
數據通過key-value的形式被put到了map里,在put之前通過sizeOf方法計算value的size,并累加到全局變量size里,它用來記錄當前緩存的數據大小。sizeOf原則上必須重寫,用來定義自己的計算規則。然后調用了trimToSize方法,這個方法用以保證緩存大小不會超過maxSize。
一進來就是一個死循環,然后就迭代刪除位于隊首的數據。只有當前緩存容量小于maxSize的時候才break。
綜上 LruCache自己主要是實現maxSize的判斷,以及通過trimToSize對緩存的裁剪。其他存儲、提取數據的方法以及LRU的算法都是借助LinkedHashMap來實現的。
新聞熱點
疑難解答