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)的内部结构导致的。