首先明确几点: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以前,由此保证最新访问的在最前面