美文网首页Java开发周更
Java Map原理备忘(二)

Java Map原理备忘(二)

作者: 昙花未现 | 来源:发表于2018-09-24 20:10 被阅读11次

接上一次Java Map原理备忘
LinkedHashMap继承HashMap实现Map接口。
LinkedHashMap比HashMap多维护一个包含所有条目的双向链表。

    /**
     * 双链表的每一个节点,两个指针分别指向前一个节点和后一个节点。
     */
    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);
        }
    }

    /**
     * 双链表的头节点
     */
    transient LinkedHashMap.Entry<K,V> head;

    /**
     * 双链表的尾节点
     */
    transient LinkedHashMap.Entry<K,V> tail;

LinkedHashMap重新了newNode和newTreeNode方法,当执行put操作添加新节点时,会把节点插入到尾节点后面,并把尾节点执行该节点。

    Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
        LinkedHashMap.Entry<K,V> p =
            new LinkedHashMap.Entry<K,V>(hash, key, value, e);
        linkNodeLast(p);
        return p;
    }

    TreeNode<K,V> newTreeNode(int hash, K key, V value, Node<K,V> next) {
        TreeNode<K,V> p = new TreeNode<K,V>(hash, key, value, next);
        linkNodeLast(p);
        return p;
    }

    // 把节点插入到尾节点后面,并把尾节点执行该节点
    private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
        LinkedHashMap.Entry<K,V> last = tail;
        tail = p;
        if (last == null)
            head = p;
        else {
            p.before = last;
            last.after = p;
        }
    }

map.keySet(),map.values()和map.entrySet()遍历条目时通过遍历双链表来遍历。保证遍历出来的条目顺序跟插入时的顺序一样。如果条目时重复插入,条目顺序不变。

参考衔接
https://www.baeldung.com/java-linked-hashmap

相关文章

  • Java Map原理备忘(三)

    接上一次Java Map原理备忘(二)。TreeMap is a map implementation that ...

  • Java Map原理备忘(二)

    接上一次Java Map原理备忘。LinkedHashMap继承HashMap实现Map接口。LinkedHash...

  • Java Map原理备忘

    HashMap底层数据结构是数组,通过hash函数和key的hashCode方法获取key所在的数组索引,接着把k...

  • Java中Map的原理

    在Java中常常需要使用Map作为存储工具。下面一一介绍各种Map的原理。 HashMap## Java中最常用的...

  • 集合的一些源码分析

    java基础 hashmap原理 Java集合说一说吧set ,list,map都问了一遍 java中util包下...

  • 史上最详尽 Java 8 集合类 HashMap : 底层实现和

    史上最详尽 Java 8 集合类 HashMap : 底层实现和原理学习笔记(源码解析) Java中Map接口集合...

  • Android面试Java基础篇(一)

    问:Java集合类List,Map,Set相关的实现原理。 答:List和Set都是Collection的子类 ...

  • rxjava笔记(2)

    rxjava笔记(2) map与flatMap的原理 map的原理,可以查看map的源码进行分析。会发现map()...

  • TreeMap源代码分析

    TreeMap是在java.util包下面,也是有序的map集合,它的原理是“红黑树”实现的: 使用了红黑二叉树的...

  • java day 14

    Map java Map及Map.Entry详解Map是java中的接口,Map.Entry是Map的一个内部接口...

网友评论

    本文标题:Java Map原理备忘(二)

    本文链接:https://www.haomeiwen.com/subject/vhmqoftx.html