Android使用LinkedHashMap實現一個LRU算法的內存緩存

LinkedHashMap的一些特點:

  1. LinkedHashMap是一個先進先出的隊列,裏面的每一個元素都是Entry。

  2. 它的key和value都可以爲null。

  3. 在插入一個新元素時,LinkedHashMap會判斷你這個元素的key是否已經存在,如果存在,就用原來的key和你新插入的value關聯,原來的value不用了,這樣的話,LinkedHashMap還是保持原來的大小。比如你原來的LinkedHashMap中已經有了<9,”subuju”>這樣的一個鍵值對,現在你要插入一個<9,”CSDN”>的鍵值對,那麼現在的LinkedHashMap中將只存在<9,”CSDN”>的鍵值對。

  4. LinkedHashMap有兩種訪問順序,在初始化LinkedHashMap時,可以設置它的accessOrder,如果accessOrder爲true,LinkedHashMap將把每次被訪問的元素移至隊尾,利用它實現LRU算法就是利用了這個特點,如果accessOrder爲false時,將按照插入元素的順序排列。

LRU算法是最近最少使用的算法,下面的例子以圖片的名字作爲key,以Bitmap爲value。
實現思路,分以下三步:

  1. 開闢一塊緩存Bitmap的總內存空間cacheSize,設置一個變量currentSize(初始值爲0)用於表示當前已使用的cacheSize的大小。

  2. 緩存一張新圖片時,先獲得圖片的大小,然後加上currentSize。

  3. 用currentSize和cacheSize比較,如果currentSize > cacheSize,則表示我們已經緩存的所有圖片包括我們正在緩存的這張圖片所佔用的內存已經超出了我們設定的最大值cacheSize,獲得LinkedHashMap的隊頭元素,並把它移除,調整currentSize,繼續和cacheSize比較,如果還是大於,則繼續移除隊頭元素,直到currentSize <= cacheSize爲止。

第一步代碼實現:
這裏寫圖片描述

第二步代碼實現:
這裏寫圖片描述

第三步代碼實現:
這裏寫圖片描述

發佈了34 篇原創文章 · 獲贊 19 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章