Java簡單了解LruCache原始碼

2021-08-21 18:49:28 字數 1541 閱讀 8025

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

2.呼叫put()方法,其中的safesizeof()方法中呼叫了sizeof()方法,其中預設的是返回的1.這個需要我們重寫sizeof()方法,進行計算大小。其中sizeof()就是進行計算儲存的資料所佔的記憶體的大小。 size+=safesizeof(key,value)就是進行新增新的資料的時候,新資料佔據的記憶體的大小。如果previous!=null那麼證明當前的key值下原先已經有資料,那麼新增資料的時候就會進行替換。這時候要進行計算舊資料的大小,然後用size減去舊資料的大小。

然後呼叫trimtosize(maxsize)方法,進行判斷新增資料後,是否超出設定的儲存大小。如果沒有超過設定的儲存數值,那麼就跳出這個迴圈。否則就使用linkedhashmap的中的方法將最老的節點刪除。獲取最老節點的方法和linkedhashmap中的addbefore()方法相關。

使用lrucache中的get()方法,在這個方法中如果取key的時候,沒有這個數值,那麼就呼叫create(key)方法建立乙個value數值,然後呼叫put()方法儲存進去。

這個create(key)預設返回的就是null。這個create()方法能夠進行重寫,估計是為了提供預設儲存的數值進行的一種設計。

具體的用法:

long maxmemory = runtime.getruntime().maxmemory();

int cachesize = (int) (maxmemory / 8);

lrucache lrucache = new lrucache(cachesize)

@override

protected bitmap create(string key)

};

簡單了解java集合

首先我放一張前輩畫的圖,大家可以大致看一下,了解一下 1 map與list set沒有任何關係 2 list與set的父介面是collection,而map的父介面不是collection 3 collection下還有乙個不是經常用的queue集合 4 collection的父介面是iterato...

Python實現的乙個簡單LRU cache

起因 我的同事需要乙個固定大小的cache,如果記錄在cache中,直接從cache中讀取,否則從資料庫中讀取。python的dict 是乙個非常簡單的cache,但是由於資料量很大,記憶體很可能增長的過大,因此需要限定記錄數,並用lru演算法丟棄舊記錄。key 是整型,value是10kb左右的p...

了解Java加密

可逆加密 1.對稱加密 加密金鑰和解密的金鑰一樣 des 金鑰長度 56位 3des 金鑰長度 168位 aes 金鑰長度 128位 192位 256位 2.非對稱加密 加密金鑰和解密的金鑰不一樣 公鑰 和 私鑰 加密演算法 公鑰加密 私鑰解密 簽名演算法 私鑰簽名 公鑰驗籤 rsa 1024 rs...