LinkedHashMap

Posted ericguoxiaofeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedHashMap相关的知识,希望对你有一定的参考价值。

概况:

LinkedHashMap是继承HashMap类,说明LinkedHashMap有HashMap的一切特性
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

LinkedHashMap 是基于 HashMap 实现的一种集合,具有 HashMap 集合上面所说的所有特点,除了 HashMap 无序的特点,LinkedHashMap 是有序的,因为 LinkedHashMap 在 HashMap 的基础上单独维护了一个具有所有数据的双向链表,该链表保证了元素迭代的顺序。

所以我们可以直接这样说:LinkedHashMap = HashMap + LinkedList。LinkedHashMap 就是在 HashMap 的基础上多维护了一个双向链表,用来保证元素迭代顺序。

所以在概念上面说,比hashmap多了before,after,head,tail这几个东东

技术分享图片

                                  (去掉红色和蓝色的虚线指针,其实就是一个HashMap。)

 

源码:

常量,注意:head和tail其实这两个类型和下面的after,before是一样的,注意匿名内部类

技术分享图片
    transient LinkedHashMap.Entry<K,V> head;//用来指向双向链表的头节点
    transient LinkedHashMap.Entry<K,V> tail;//用来指向双向链表的尾节点
    final boolean accessOrder;// true 表示按照访问顺序,会把访问过的元素放在链表后面,放置顺序是访问的顺序;false 表示按照插入顺序遍历
View Code

构造方法

技术分享图片
    public LinkedHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        accessOrder = false;
    }

    public LinkedHashMap(int initialCapacity) {
        super(initialCapacity);
        accessOrder = false;
    }

    public LinkedHashMap() {
        super();
        accessOrder = false;
    }
View Code

静态内部类:比hashmap只多了一个before和after,指向前后的entry

技术分享图片
    static class Entry<K,V> extends HashMap.Node<K,V> {
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
            super(hash, key, value, next);// entry的构造方法不同于其它的,它是直接调用父类的构造方法,就是下面那个,hashmap的一个静态内部类
        }
    }
    
    /*
     * hashmap的静态内部类node节点
     */
    static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;

        Node(int hash, K key, V value, Node<K,V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
        ......
    }
View Code

更详细的东东,看这个就可以了,我也是: JDK1.8源码(九)——java.util.LinkedHashMap 类

 

 参考:

1)JDK1.8源码(九)——java.util.LinkedHashMap 类

图片来源:

1)JDK1.8源码(九)——java.util.LinkedHashMap 类

 

 

 

END!

以上是关于LinkedHashMap的主要内容,如果未能解决你的问题,请参考以下文章

LinkedHashMap 源码分析

LinkedHashMap实现LRU算法

访问 LinkedHashMap 中最后一个对象中的方法

通过比较LinkedHashMap中的值来获取密钥

Java集合详解5:深入理解LinkedHashMap和LRU缓存

LinkedHashMap与HashMap的区别