LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
p.before = p.after = null;
if (b == null)
head = a;
else
b.after = a;
if (a == null)
tail = b;
else
a.before = b;
}
这个是在节点被删后的处理方法 在HashMap中属于模板方法
先将参数e强转为LinkedHashMap的Entry类型 然后获取这个节点的before和after节点 固化为b和a
先把before after的引用都清空
判断b如果为空 head节点就设为a 如果b不为空b的after节点为a
判断如果a为空 tail节点设为b 如果a不为空 a的before节点为b
void afterNodeInsertion(boolean evict) { // possibly remove eldest
LinkedHashMap.Entry<K,V> first;
if (evict && (first = head) != null && removeEldestEntry(first)) {
K key = first.key;
removeNode(hash(key), key, null, false, true);
}
}
这个方法是在节点添加后的处理方法 在HashMap中属于模板方法
首先创建Entry类临时变量first
然后判断参数evict是否为true 且 将head赋给first之后 first是否还为空 且调用removeEldestEntry方法返回值是否为true 如果都为true
first的key就赋给一个临时变量key 调用removeNode节点删除key对应的键值对
void afterNodeAccess(Node<K,V> e) { // move node to last
LinkedHashMap.Entry<K,V> last;
if (accessOrder && (last = tail) != e) {
LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
p.after = null;
if (b == null)
head = a;
else
b.after = a;
if (a != null)
a.before = b;
else
last = b;
if (last == null)
head = p;
else {
p.before = last;
last.after = p;
}
tail = p;
++modCount;
}
}
这个方法是将节点移动到最后的方法 在HashMap中是模板方法
先创建Entry类临时变量last
判断如果accessOrder为true且将tail赋给last之后last不是参数e
将e强转为Entry对象p 将p的before和after固化为b和a
将p的after清空
判断如果b为空 head赋为a 否则b的after节点赋为a
判断如果a不为空
a的before节点赋为b 否则last节点赋为b
判断如果last为空 head赋为p 否则p的before节点赋为last last的after节点赋为p
tail赋为p
modCount自增
这个方法的意义在于 一旦访问了某个节点 并且accessOrder为true 就将这个节点放在队尾 遍历时最后遍历刚访问的节点
void internalWriteEntries(java.io.ObjectOutputStream s) throws IOException {
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after) {
s.writeObject(e.key);
s.writeObject(e.value);
}
}
这个方法是写出键值对各个节点的方法比较简单 不多说了 就是遍历after属性 然后用输出流往外写