一 特性
- 是双向链表,使用链表记录的插入的顺序也可以使用访问顺序,有个构造方法的参数accessOrder 是使用访问顺序的,会将访问过的节点放到队尾,
- 可以用来实现LRU算法
- 是有序的,遍历输出顺序和put的顺序一致,注意按照访问顺序输出,被访问过的entity会被链接到尾部
- 非同步的,并且支持null键和值
- 继承hashMap,部分特性和hashMap一样,比如hash方法,部分方法使用hashMap
二 属性
```java //头结点 transient LinkedHashMap.Entryhead;
//尾结点
transient LinkedHashMap.Entry
<a name="wzZD3"></a>
# 四 添加
```java
//在调用hashMap的添加方法之后调用这个 将节点记录到链表上
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的删除方法之后,结尾调用了这个方法在链表上删除对应的节点
void afterNodeRemoval(Node<K,V> e) { // unlink
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;
}
六 获取
public V get(Object key) {
Node<K,V> e;
//调用hashMap的get方法
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}