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)

猜你喜欢

转载自blog.csdn.net/zhangjin1120/article/details/121441937