首先明確幾點:java
LinkedHashMap繼承在HashMap,非線程安全的安全
數據存儲是經過HashMap存儲,自身經過鏈表存儲ide
LinkedHashMap中Entry繼承自HashMap的Entry,擴展了兩個字段:before和after:實現了數據的有序存儲this
LinkedHashMap中有一個字段accessOrder,默認是false:按照插入順序排序,不然按照訪問順序排序,即LRU算spa
如今看下代碼:線程
@Override void init() { header = new Entry<>(-1, null, null, null); header.before = header.after = header; }
初始化:默認建立一個hash值爲-1的Entry,befor和after都是自身引用
code
void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; Entry<K,V> e = new Entry<>(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++; }
建立新的Entry:在header以前插入排序
private void addBefore(Entry<K,V> existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; }
看圖簡單理解下:繼承
void recordAccess(HashMap<K,V> m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } }
這個方法會在HashMap的get和put方法調用,那它的做用是:根據accessOrder修改數據存儲順序rem
若是是訪問順序,即accessOrder是true,那麼先把本身從鏈表刪除,而後添加到header以前,由此保證最新訪問的在最前面