Java中HashMap的元素遍历顺序问题及处理

 更新时间:2026年01月14日 08:38:06   作者:五月天的尾巴  
文章总结了HashMap、LinkedHashMap和TreeMap在遍历顺序上的区别,HashMap不保证遍历顺序,LinkedHashMap保证插入顺序,而TreeMap保证键的顺序,理解这些特性有助于在编程中选择合适的Map实现

一、前言

在项目中遍历HashMap集合时,发现遍历entrySet()的顺序与map集合中的顺序不一致,特写此篇文章记录一下。

HashMap在存储时的顺序是无序的这个我是知道的,但是本来以为存储之后,遍历的时候是按照HashMap集合中的顺序遍历的,结果发现遍历的时候与集合中的顺序也不一致。

Map<String,String> map = new HashMap<>();
// map.put()  .........

for(Map.Entry<String,String> item:map.entrySet()){
    System.out.println(item.getKey()+"  "+item.getValue());
}

如上图:map.entrySet()遍历后的顺序有可能会乱序,与HashMap存储的顺序不一致。

二、原理解释

在Java中,Map 接口的实现(如 HashMap,LinkedHashMap,TreeMap 等)并不保证遍历 keySet() 或 entrySet() 时的顺序。但是,某些特定的 Map 实现确实提供了特定的遍历顺序。

  • 1、HashMap:它基于哈希表实现,并不保证映射的顺序,特别是遍历顺序。因此,当你使用 map.keySet() 遍历 HashMap 时,结果可能会看起来像是“倒序”或“随机”的,但这并不是真正的倒序或随机,而是基于哈希表和内部数组结构的结果。
  • 2、LinkedHashMap:它维护了一个运行于所有条目的双向链表。此链表定义了迭代顺序,通常是按照条目插入到映射中的顺序(插入顺序)。注意,如果此映射由于重新插入(重新插入键/值对)而导致结构修改,则迭代顺序可能会受到影响。
  • 3、TreeMap:它基于红黑树实现,可以保证按照键的自然顺序或创建 TreeMap 时提供的 Comparator 进行排序。
    如果你发现你的 Map 遍历结果看起来像是“倒序”的,并且你没有使用 LinkedHashMap 或 TreeMap,那么这可能是由于你使用的 Map 实现(很可能是 HashMap)的内部结构导致的。

三、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合Thymeleaf的方法

    SpringBoot整合Thymeleaf的方法

    这篇文章主要介绍了SpringBoot整合Thymeleaf的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下,希望能够帮助到你
    2021-07-07
  • Java内部类之间的闭包和回调详解

    Java内部类之间的闭包和回调详解

    相信闭包和回调对每位学习Java的人来说都不陌生,那么今天小编和大家分享一篇关于Java内部类之间的闭包和回调,有需要的可以参考借鉴。
    2016-09-09
  • Logback配置文件这么写,还说你不会整理日志?

    Logback配置文件这么写,还说你不会整理日志?

    logback框架会默认加载classpath下命名为logback-spring.xml或logback.xml的配置文件。这篇文章主要介绍了Logback配置文件写法,需要的朋友可以参考下
    2020-07-07
  • SpringMVC如何访问WEB-INF jsp过程解析

    SpringMVC如何访问WEB-INF jsp过程解析

    这篇文章主要介绍了SpringMVC如何访问WEB-INF jsp过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot自定义工具类实现Excel数据存入MySQL数据库

    SpringBoot自定义工具类实现Excel数据存入MySQL数据库

    这篇文章主要为大家详细介绍了如何使用EasyExcel读取Excel内数据并转换为csv格式数据,然后实现字符串分割,分割出属性名和属性值建表插入MySQL数据库中,感兴趣的可以了解下
    2024-03-03
  • Hikari连接池使用SpringBoot配置JMX监控实现

    Hikari连接池使用SpringBoot配置JMX监控实现

    Hikari是Spring Boot默认的数据库连接池。区别于C3P0直接通过连接池对象获取各项状态指标,Hikari需要通过JMX来获取。本文就详细的来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • RabbitMQ中的Channel和Exchange详解

    RabbitMQ中的Channel和Exchange详解

    这篇文章主要介绍了RabbitMQ中的Channel和Exchange详解,创建和销毁TCP连接很耗时,打开太多TCP连接,耗操作系统资源,并发量大到一定程度,系统的吞吐量会降低,使用一个connection多channel的方式,可以提升连接的利用率,需要的朋友可以参考下
    2023-08-08
  • java软引用在浏览器使用实例讲解

    java软引用在浏览器使用实例讲解

    在本篇文章里小编给大家整理的是一篇关于java软引用在浏览器使用实例讲解内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • IDEA调试源码小技巧之辨别抽象类或接口多种实现类的正确路径

    IDEA调试源码小技巧之辨别抽象类或接口多种实现类的正确路径

    这篇文章主要介绍了IDEA调试源码小技巧之辨别抽象类或接口多种实现类的正确路径,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决

    Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决

    这篇文章主要介绍了Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决,文章围绕主题展开详细的内容介绍,具有一定的参考一下
    2022-08-08

最新评论