Android SDK中的LinkedHashMap是双向循环链表存储的
而JDK中LinkedHashMap是双向无环链表存储的。
而且在A 中 每次put都会将最新的Entry 放到 对应table[index]中 变成桶中第一个元素,JDK中直接放在已找到的Entry next上。 如果在put过程中找到最新的元素会进行makeTail操作!把最新的entry放到尾部,最老的的在header.next 中 所以 eldest方法会返回这个“最老”的值。 反正在A中只要“命中一次”(包括 put中寻找旧值 get中寻找目标值) 就会 makeTail一次 把最新的Entry 发在末尾处。 JDK也是如此。只不过一个单链表一个双链表 操作的细节有些不同。
</pre>JDK“命中后”添加到尾部<p><pre name="code" class="java"> 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;<span style="white-space:pre"> </span> //要放在尾部的节点后继值为空
if (b == null)<span style="white-space:pre"> </span> //判断是不是第一个节点是就当做头<span style="white-space:pre"> </span>
head = a;
else
b.after = a;
if (a != null)<span style="white-space:pre"> </span>//要删除的节点前驱的后继指向后继
a.before = b; //要删除的节点的后继指向前驱
else
last = b;
if (last == null)
head = p;
else {
p.before = last;
last.after = p;
}
tail = p; //变为末尾
++modCount;
}
}
Android SDK “命中后”添加到尾部 private void makeTail(LinkedEntry<K, V> e) {
// Unlink e
e.prv.nxt = e.nxt;
e.nxt.prv = e.prv;
// Relink e as tail
LinkedEntry<K, V> header = this.header;
LinkedEntry<K, V> oldTail = header.prv;
e.nxt = header;
e.prv = oldTail;
oldTail.nxt = header.prv = e;
modCount++;
}
一看就比JDK的操作省事。
连接的过程有点复杂没写