newNode
// 在新增node的時(shí)候會(huì)調(diào)用這里丐重,用額外的一個(gè)雙向鏈表來記錄內(nèi)部key的順序
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
LinkedHashMap.Entry<K,V> last = tail;
tail = p;
// 如果沒有l(wèi)ast昵观,說明是空的啊送,直接放入頭部
if (last == null)
head = p;
else {
// 如果有放入尾部
p.before = last;
last.after = p;
}
}
afterNodeAccess
// 說白了利虫,這里就是將該節(jié)點(diǎn)放到順序鏈表尾部
void afterNodeAccess(Node<K,V> e) { // move node to last
LinkedHashMap.Entry<K,V> last;
// 如果啟動(dòng)訪問順序,且當(dāng)然讀取的kv不是順序鏈表的末尾
if (accessOrder && (last = tail) != e) {
// 拿到該node的前后繼節(jié)點(diǎn)
LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
// 先斷開后繼節(jié)點(diǎn)
p.after = null;
// 如果沒有前繼節(jié)點(diǎn)羡蛾,說明鏈表為空滞项,直接作為頭部
if (b == null)
head = a;
else
// 否則將前繼對接后繼
b.after = a;
// 如果后繼節(jié)點(diǎn)存在,后繼對接前繼
if (a != null)
a.before = b;
else
// 如果不存在枫夺,說明是尾部,直接將前繼賦予last
last = b;
// 如果鏈表為空谈截,將該節(jié)點(diǎn)直接對接頭部
if (last == null)
head = p;
// 將該節(jié)點(diǎn)放到鏈表末尾
else {
p.before = last;
last.after = p;
}
// 賦給tail
tail = p;
++modCount;
}
}