一 特性

  • 是双向链表,使用链表记录的插入的顺序也可以使用访问顺序,有个构造方法的参数accessOrder 是使用访问顺序的,会将访问过的节点放到队尾,
  • 可以用来实现LRU算法
  • 是有序的,遍历输出顺序和put的顺序一致,注意按照访问顺序输出,被访问过的entity会被链接到尾部
  • 非同步的,并且支持null键和值
  • 继承hashMap,部分特性和hashMap一样,比如hash方法,部分方法使用hashMap

    二 属性

    ```java //头结点 transient LinkedHashMap.Entry head;

//尾结点 transient LinkedHashMap.Entry tail;

  1. <a name="wzZD3"></a>
  2. # 四 添加
  3. ```java
  4. //在调用hashMap的添加方法之后调用这个 将节点记录到链表上
  5. void afterNodeInsertion(boolean evict) { // possibly remove eldest
  6. LinkedHashMap.Entry<K,V> first;
  7. if (evict && (first = head) != null && removeEldestEntry(first)) {
  8. K key = first.key;
  9. removeNode(hash(key), key, null, false, true);
  10. }
  11. }

五 删除

  1. //同样是调用hashMap的删除方法之后,结尾调用了这个方法在链表上删除对应的节点
  2. void afterNodeRemoval(Node<K,V> e) { // unlink
  3. LinkedHashMap.Entry<K,V> p =
  4. (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
  5. p.before = p.after = null;
  6. if (b == null)
  7. head = a;
  8. else
  9. b.after = a;
  10. if (a == null)
  11. tail = b;
  12. else
  13. a.before = b;
  14. }

六 获取

  1. public V get(Object key) {
  2. Node<K,V> e;
  3. //调用hashMap的get方法
  4. if ((e = getNode(hash(key), key)) == null)
  5. return null;
  6. if (accessOrder)
  7. afterNodeAccess(e);
  8. return e.value;
  9. }