LinkedHashMap 底层分析(上)

简介: 众所周知 HashMap 是一个无序的 Map,因为每次根据 key 的 hashcode 映射到 Entry 数组上,所以遍历出来的顺序并不是写入的顺序。

众所周知 HashMap 是一个无序的 Map,因为每次根据 keyhashcode 映射到 Entry 数组上,所以遍历出来的顺序并不是写入的顺序。


因此 JDK 推出一个基于 HashMap 但具有顺序的 LinkedHashMap 来解决有排序需求的场景。


它的底层是继承于 HashMap 实现的,由一个双向链表所构成。


LinkedHashMap 的排序方式有两种:


  • 根据写入顺序排序。


  • 根据访问顺序排序。


其中根据访问顺序排序时,每次 get 都会将访问的值移动到链表末尾,这样重复操作就能的到一个按照访问顺序排序的链表。


数据结构


@Test
  public void test(){
    Map<String, Integer> map = new LinkedHashMap<String, Integer>();
    map.put("1",1) ;
    map.put("2",2) ;
    map.put("3",3) ;
    map.put("4",4) ;
    map.put("5",5) ;
    System.out.println(map.toString());
  }


调试可以看到 map 的组成:



打开源码可以看到:


/**
     * The head of the doubly linked list.
     */
    private transient Entry<K,V> header;
    /**
     * The iteration ordering method for this linked hash map: <tt>true</tt>
     * for access-order, <tt>false</tt> for insertion-order.
     *
     * @serial
     */
    private final boolean accessOrder;
    private static class Entry<K,V> extends HashMap.Entry<K,V> {
        // These fields comprise the doubly linked list used for iteration.
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {
            super(hash, key, value, next);
        }
    }  


其中 Entry 继承于 HashMapEntry,并新增了上下节点的指针,也就形成了双向链表。


还有一个 header 的成员变量,是这个双向链表的头结点。


上边的 demo 总结成一张图如下:



第一个类似于 HashMap 的结构,利用 Entry 中的 next 指针进行关联。


下边则是 LinkedHashMap 如何达到有序的关键。


就是利用了头节点和其余的各个节点之间通过 Entry 中的 afterbefore 指针进行关联。


其中还有一个 accessOrder 成员变量,默认是 false,默认按照插入顺序排序,为 true 时按照访问顺序排序,也可以调用:


public LinkedHashMap(int initialCapacity,
                         float loadFactor,
                         boolean accessOrder) {
        super(initialCapacity, loadFactor);
        this.accessOrder = accessOrder;
    }


这个构造方法可以显示的传入 accessOrder


相关文章
|
9月前
|
存储 算法 Java
HashMap 之底层数据结构和扩容机制
HashMap 之底层数据结构和扩容机制
422 1
|
19天前
|
存储 Java Serverless
谈谈我对HashMap扩容机制的理解及底层实现
谈谈我对HashMap扩容机制的理解及底层实现
|
19天前
|
存储 Java
【JDK 源码分析】HashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】HashMap 底层结构
|
10月前
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
19天前
|
存储 安全
ConcurrentHashMap 底层具体实现
ConcurrentHashMap 底层具体实现
|
19天前
|
存储 安全 Java
Hashtable和HashMap:差异,数据结构概述,以及JDK的影响
Hashtable和HashMap:差异,数据结构概述,以及JDK的影响
27 0
|
11月前
|
存储 算法 安全
HashMap的遍历方式及底层原理
HashMap的遍历方式及底层原理
|
存储 算法
【HashMap底层运行原理】
【HashMap底层运行原理】
|
存储 容器
【HashMap底层数据结构】
【HashMap底层数据结构】