LinkedHashMap是如何实现有序的?

Posted zhangjin1120

tags:

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

LinkedHashMap是怎么实现有序的?

LinkedHashMap内部持有两个成员变量,headtail,是双链表结点。
 在插入数据时,仍然调用HashMap的put方法,将数据保存在原先的数组+链表/红黑树的数据结构中,put方法中调用了newNode()。LinkedHashMap重写了newNode()方法,在newNode方法中,把新的结点插入双向链表。采用尾插法,保证了后插入的数据,位于双向链表的尾部。遍历时,从head结点开始遍历输出,输出顺序自然就和插入顺序一样。

LinkedHashMap迭代遍历的源码分析

常见的两种用iterator遍历方式:

    public static void testOrdered() 
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(0, "zhangjin");
        map.put(1, "lisi");
        map.put(2, "wangwu");
        map.put(3, "lll");
        map.put(4, "aaa");
        map.put(5, "bbb");

        Iterator iterator = map.entrySet().iterator();
        while (iterator.hasNext()) 
            Map.Entry entry = (Map.Entry) iterator.next();
            System.out.print(entry.getValue()+" ");
        

        System.out.println();
        for (String str : map.values()) 
            System.out.print(str + " ");
        
    

entrySet()返回的是LinkedEntrySet

LinkedEntrySet.iterator()返回的是LinkedEntryIterator

LinkedEntryIterator继承了LinkedHashIterator,所以LinkedEntryIterator.next()方法,内部调用了父类的nextNode()方法。

LinkedHashIterator.nextNode()方法,从head结点,依次向尾结点遍历,这样就保证了有序遍历。

下面这篇文章写的真不错:
18赞:面试必备:LinkedHashMap源码解析(JDK8)

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

计算机程序的思维逻辑 (49) - 剖析LinkedHashMap

JAVA集合LinkedHashMap及其源码分析

从 LinkedHashMap 构建有序 JSON 字符串

有序的map LinkedHashMap

Map的有序和无序实现类,与Map的排序

java的LinkedHashSet是怎样实现存取有序的, 底层原理是啥