LruCache原理分析
LruCache:
LruCache是個泛型類,主要演算法原理是把最近使用的對象用強引用(即我們平常使用的對象引用方式)存儲在 LinkedHashMap 中。當緩存滿時,把最近最少使用的對象從內存中移除,並提供了get和put方法來完成緩存的獲取和添加操作。
強引用:直接對象的引用弱引用:當一個對象只有一個弱引用存在時,此對象隨時會被GC回收軟引用:當一個對象只有一個軟引用存在時,當系統內存不足時,會被GC回收LruCache使用:
這段代碼主要是確定LruCache的緩存大小,重寫SizeOf是確定圖片的大小。(單位要統一)
原理:
LruCache的核心就是維護一個緩存對象列表,其中列表對象的緩存排序為順序排序,就是一直沒訪問的對象,將放在隊尾,即將被淘汰。而最近訪問的對象將放在隊頭,最後被淘汰。而這個隊列是由LinkHashMap來維護的,它是一個數組+雙向鏈表的數據結構來實現的。其中雙向鏈表的結構可以實現訪問順序和插入順序。這樣的特性可以讓LinkHashMap可以實現順序排序。
分析LinkHashMap:看一下LinkHashMap的構造函數
其中當參數 accessOrder=true,為排序,為false時為插敘。那麼LinkHaspMap,又是如何添加,獲取還有刪除的?看下LruCache的put(添加):
看一下 trimToSize()方法:
trimToSize()方法,就是一添加就會去循環判斷緩存是否已滿,不滿則跳出循環,否則就刪除最先訪問的對象。看一下get方法:
點進去get();
由此可見LruCache中維護了一個集合LinkedHashMap,該LinkedHashMap是以訪問順序排序的。當調用put()方法時,就會在結合中添加元素,並調用trimToSize()判斷緩存是否已滿,如果滿了就用LinkedHashMap的迭代器刪除隊尾元素,即近期最少訪問的元素。當調用get()方法訪問緩存對象時,就會調用LinkedHashMap的get()方法獲得對應集合元素,同時會更新該元素到隊頭。
※達沃斯論壇上的各國領導人對區塊鏈技術給予很高的評價,同時也會加大數字貨幣的監管
※用這種辦法經營家庭,會讓你的婚姻跟戀愛一樣甜蜜
TAG:全球大搜羅 |