栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LinkedHashMap是如何实现有序的?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LinkedHashMap是如何实现有序的?

linkedHashMap是怎么实现有序的?

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

linkedHashMap迭代遍历的源码分析

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

    public static void testOrdered() {
        linkedHashMap 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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571588.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号