LinkedHashMap中重写了HashMap的get
方法,不止会取出所索要的节点的值,而且会调整LinkedHashMap中内置的链表中该键所对应的节点的位置,将该节点置为链表的尾部。
public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
void afterNodeAccess(Node<K,V> e) { // move node to last
LinkedHashMap.Entry<K,V> last;
// 首先判断尾部节点是否为要移动的节点,如果不是的话才进入下一步的操作
if (accessOrder && (last = tail) != e) {
// 为e重新赋名,并保存其前一节点与后一节点
LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
// 将指向后一节点的指针清空
p.after = null;
// 如果没有前一节点,则将该节点的后一节点设为头节点,否则,将其前置节点的后节点指针指向p的后置节点
if (b == null)
head = a;
else
b.after = a;
// 如果后置节点不为空,则将前置节点的后节点指针指向p的后置节点,否则,将last指向p的前置节点
if (a != null)
a.before = b;
else
last = b;
// 如果last为空,说明没有前面的节点了,则将LinkedHashMap的头节点指向p,否则,将p的前节点指针指向last,last的后节点指针指向p
if (last == null)
head = p;
else {
p.before = last;
last.after = p;
}
// 最后,将LinkedHashMap的尾节点指向p
tail = p;
++modCount;
}
}