LinkHashMap(關鍵的數據結構)算法
最新的元素指向頭表(頭表前一個元素,Tail)(頭表後一個元素指向最老的元素)在構造器中,head.nxt=head.prv,此時鏈表爲空數組
LinkedHashMap#makeTail Lru算法關鍵緩存
將元素插入到頭表前一個元素(離頭表最近的元素,也是最新的元素),此方法在get和put中會被調用數據結構
LinkedHashMap實現了HashMap的preModify和postRemove方法,在這兩個方法中將元素以鏈表的形式(LinkedEntry)連接起來,這兩個方法分別對應put和remove。LinkedHashMap重寫了get方法,實現方式是在Map的基礎上添加了makeTail方法post
HashMap remove方法spa
第一次循環,pre=null e=頭結點對象
if判斷裏邊:條件:hash相同且key值相同 表示:要刪除的元素找到了繼承
若是pre爲Null表明要刪除的是頭節點,將該位置轉向存放當前節點下一個,並刪除當前節點內存
若是pre不爲空,表明當前的e是要刪除的目標,pre指向e的上一個節點,爲了刪除e,將pre指向e的下一個,將e放空,而後刪除之rem
HashMap 遍歷原理
三種Iterator都繼承HashIterator
在iterator()方法中會建立KeyIterator對象,KeyIterator繼承HashIterator,因爲KeyIterator沒有重寫構造函器,因而會調用HashIterator的構造器,在HashIterator構造器中會遍歷Entry的數組(table),從0找到第一個不爲空的Entry,記爲nextEntry
在next()方法中會調用HashIterator的nextEntry(),在nextEntry()方法中會先記錄當前nextEntry的值,而後判斷nextEntry.next是否爲空(Entry是一個鏈表,鏈表連接的是經過hash算出的地址相同的元素(hash衝突)Entry.next能夠得到下一個地址相同的元素),若是是則找尋下一個不爲空的index,不然直接賦值給nextEntity,最後返回剛纔記錄的值
HashMap計算元素下標原理
取得元素hash
將hash和table.length相與
LRUCache原理
LinkedHashMap在每次(經過key)preModify(Map中put方法調用)和(經過key)get時都會調用makeTail將該元素添加到鏈表尾部(離頭表最近)
LruCache類在每次put元素到LinkedHashMap後都會調用trimToSize方法(根據每一個元素的大小(經過sizeOf方法得到元素大小)算出當前總大小size,並和maxSize比較,若是大於maxSize就從LinkedHashMap頭部開始刪除(離頭表最遠的header.nxt),每刪除一次就比較一下大小,直到size<=maxSize爲止,每次刪除都會調用LinkedHashMap重寫的postRemove方法將元素斷鏈,entrySet()和next()方法的重寫使得迭代器從離頭表最遠處開始刪除元素)調整元素數量,LruCache的自動刪除使內存佔用達到平衡,並因爲LinkedHashMap的特性,使得每次刪除的都是使用最少的元素,保證了高頻元素的留存性
DiskLruCache理解
journalFile:提供緩存目錄信息,記錄讀寫操做的文件,用來提供刪除依據
open方法:創建緩存目錄和journalFile文件
Editor:用來提供寫入操做相關功能
LinkedHashMap:文件信息的緩存,經過journalFile得到,經過該緩存信息決定要刪除的文件順序
原理:
創建緩存目錄,經過journalFile記錄每次操做,用LinkedHashMap緩存操做的文件名空間等信息,根據journalFile裏面包含的信息得到LinkedHashMap,遍歷LinkedHashMap並根據佔用大小移除排在LinkedHashMap離頭表遠的文件,原理和LruCache是同樣的,只不過須要先(經過journalFile)讀取一遍緩存文件的信息,以肯定LinkedHashMap中文件元素的位置而已