前言
LinkedHashMap继承于HashMap
应用场景
HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。
1 | Map<String, String> hashMap = new HashMap<String, String>(); |
输出结果
1 | key:name6,value:value6 |
同样的数据,我们再试试LinkedHashMap
1 | Map<String, String> hashMap = new LinkedHashMap<>(); |
输出结果
1 | key:name5,value:value5 |
LinkedHashMap是有序的,且默认为插入顺序。
LinkedHashMap空参的构造方法。
1 | public LinkedHashMap() { |
这里accessOrder设置为false,表示不是访问顺序而是插入顺序存储的,这也是默认值,表示LinkedHashMap中存储的顺序是按照调用put方法插入的顺序进行排序的。LinkedHashMap也提供了可以设置accessOrder的构造方法。
在HashMap的构造函数中,调用了init方法,而在HashMap中init方法是空实现,但LinkedHashMap重写了该方法,所以在LinkedHashMap的构造方法里,调用了自身的init方法,init的重写实现如下:
1 | /** |
LinkedHashMap有自己的静态内部类Entry,它继承了HashMap.Node,定义如下:
1 | static class Entry<K,V> extends HashMap.Node<K,V> { |
所以LinkedHashMap构造函数,主要就是调用HashMap构造函数初始化了一个Entry[] table,然后调用自身的init初始化了一个只有头结点的双向链表。
总结
LinkedHashMap 是继承于HashMap,是基于HashMap和双向链表来实现的。
HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
LinkedHashMap是线程不安全的。