LruCache原始碼解析 快取策略分析

2021-10-05 08:59:32 字數 1826 閱讀 7305

最近在學習glide原始碼用到了lrucache,lru (least recently used) 的意思就是近期最少使用演算法,它的核心思想就是會優先淘汰那些近期最少使用的快取物件。

//有序map,此處用到了基於訪問的排序

private final linkedhashmapmap;

//當前快取容量

private int size;

//最大快取容量

private int maxsize;

//put次數

private int putcount;

//子類重新create()方法有效,當根據key找不到對應的value,建立value的次數

private int createcount;

//**資源的次數

private int evictioncount;

//命中(根據key獲取到value)的次數

private int hitcount;

//錯誤(根據key找不到value)的次數

private int misscount;

這些是lrucache中定義的全域性變數,理解後這個類就變得非常易懂。

我們先來看一下構造方法,這裡包含了lrucache實現的主要原理

public lrucache(int maxsize)  else 

}

linkedhashmap

構造方法

public linkedhashmap(int initialcapacity,float loadfactor,boolean accessorder)
引數說明:

initialcapacity   初始容量大小,使用無參構造方法時,此值預設是16

loadfactor       載入因子,使用無參構造方法時,此值預設是 0.75f

accessorder   false: 基於插入順序     true:  基於訪問順序

(最近訪問的value放在linkedhashmap的最後)

map.put()方法說明:

map裡的put方法,如果key值不存在,則返回值是null,

如果key存在,則會返回原先被替換掉的value值.(當

然map中的key和value都允許是null)

上面是我們的準備工作,下面列舉了兩個關鍵的方法予以說明,都新增詳細的注釋

put():

public final v put(@nonnull k key, @nonnull v value) 

}if (previous != null)

//重新計算混存大小,如果混存資料超出maxsize則刪除map頭部的value

this.trimtosize(this.maxsize);

return previous;

} else

}

get():

public final v get(@nonnull k key)  else 

//如果沒有拿到map中資料,那麼miss+1

++this.misscount;

}//呼叫子類建立value,

v createdvalue = this.create(key);

//lrucache中資料是null,所以會直接返回null

if (createdvalue == null) else else

}if (mapvalue != null) else }}

}

LruCache原始碼解析

在android中乙個應用程式占用的記憶體是有限的,而android中通常需要載入很多顯示給使用者,是很消耗記憶體的,稍微處理不好就很容易報oom異常。而且無論是從本地還是網路獲取,解析並載入進記憶體都是乙個耗時的過程,所以我們通常就會把一些常用的儲存在記憶體中,在使用的時候直接從記憶體中獲取,從而...

Java簡單了解LruCache原始碼

1.在lrucache的構造器中很明顯知道lrucache使用linkedhashmap,並且將accessorder設定為true。這樣在使用linkedhashmap的get 方法的時候就會使其雙鏈表重新進行排序,也就是將當前查詢的節點斷開,然後呼叫addbefore 方法重新將節點新增到雙鏈表...

Glide 原始碼解析 之 快取

glide 的快取型別有 2 種 記憶體快取 檔案快取 每種型別的快取又各有2級,共計 4 級快取 一級記憶體快取 activeresource 二級記憶體快取 lruresourcecache 一級檔案快取 二級檔案快取 通過hashmap weakreference實現 final mapact...