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)的内部结构导致的。
三、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解Spring中Bean后置处理器(BeanPostProcessor)的使用
BeanPostProcessor 接口也被称为Bean后置处理器,通过该接口可以自定义调用初始化前后执行的操作方法。本文将详细讲讲它的使用,需要的可以参考一下2022-06-06
tomcat connection-timeout连接超时源码解析
这篇文章主要为大家介绍了tomcat connection-timeout连接超时源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-11-11
浅谈Spring中@NotEmpty、@NotBlank、@NotNull区别
本文主要介绍了浅谈Spring中@NotEmpty、@NotBlank、@NotNull区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-02-02


最新评论