Java中HashMap的元素遍历顺序问题及处理
一、前言
在项目中遍历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自定义工具类实现Excel数据存入MySQL数据库
这篇文章主要为大家详细介绍了如何使用EasyExcel读取Excel内数据并转换为csv格式数据,然后实现字符串分割,分割出属性名和属性值建表插入MySQL数据库中,感兴趣的可以了解下2024-03-03
Hikari连接池使用SpringBoot配置JMX监控实现
Hikari是Spring Boot默认的数据库连接池。区别于C3P0直接通过连接池对象获取各项状态指标,Hikari需要通过JMX来获取。本文就详细的来介绍一下,感兴趣的可以了解一下2021-07-07
IDEA调试源码小技巧之辨别抽象类或接口多种实现类的正确路径
这篇文章主要介绍了IDEA调试源码小技巧之辨别抽象类或接口多种实现类的正确路径,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01
Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决
这篇文章主要介绍了Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决,文章围绕主题展开详细的内容介绍,具有一定的参考一下2022-08-08


最新评论