JDK1.8之LinkedHashMap简单了解

一、前言

  前面我们已经分析了HashMap的源码,已经知道了HashMap可以用在哪种场合,如果这样一种情形,我们需要按照元素插入的顺序来访问元素,此时,LinkedHashMap就派上用场了,它保存着元素插入的顺序,并且可以按照我们插入的顺序进行访问。

二、LinkedHashMap用法

复制代码
import java.util.Map;
import java.util.LinkedHashMap;

public class Test {
    public static void main(String[] args) {
        Map<String, String> maps = new LinkedHashMap<String, String>();
        maps.put("aa", "aa");
        maps.put("bb", "bb");
        maps.put("cc", "cc");
        
        for (Map.Entry entry : maps.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}
复制代码

说明:以上是展示LInkedHashMap简单用法的一个示例,可以看到它确实按照元素插入的顺序进行访问,保持了元素的插入顺序。更具体的用户可以去参照API。

三、LinkedHashMap数据结构

  

  说明:LinkedHashMap会将元素串起来,形成一个双链表结构。可以看到,其结构在HashMap结构上增加了链表结构。数据结构为(数组 + 单链表 + 红黑树 + 双链表),图中的标号是结点插入的顺序。

四、LinkedHashMap源码分析

  其实,在分析了HashMap的源码之后,我们来分析LinkedHashMap的源码就会容易很多,因为LinkedHashMap是在HashMap基础上进行了扩展,我们需要注意的就是两者不同的地方。

  4.1 类的继承关系 

public class LinkedHashMap<K,V>  extends HashMap<K,V> implements Map<K,V>

  说明:LinkedHashMap继承了HashMap,所以HashMap的一些方法或者属性也会被继承;同时也实现了Map结构,关于HashMap类与Map接口,我们之前已经分析过,不再累赘。

  4.2 类的属性

复制代码
public class LinkedHashMap<K,V>  extends HashMap<K,V> implements Map<K,V> {
    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);
        }
    }
    // 版本序列号
    private static final long serialVersionUID = 3801124242820219131L;

    // 链表头结点
    transient LinkedHashMap.Entry<K,V> head;

    // 链表尾结点
    transient LinkedHashMap.Entry<K,V> tail;

    // 访问顺序
    final boolean accessOrder;
}
复制代码

  说明:由于继承HashMap,所以HashMap中的非private方法和字段,都可以在LinkedHashMap直接中访问。



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页