在Java中,Map 接口的实现(如 HashMap,LinkedHashMap,TreeMap 等)并不保证遍历 keySet() 或 entrySet() 时的顺序。但是,某些特定的 Map 实现确实提供了特定的遍历顺序。
1、HashMap:它基于哈希表实现,并不保证映射的顺序,特别是遍历顺序。因此,当你使用 map.keySet() 遍历 HashMap 时,结果可能会看起来像是“倒序”或“随机”的,但这并不是真正的倒序或随机,而是基于哈希表和内部数组结构的结果。
2、LinkedHashMap:它维护了一个运行于所有条目的双向链表。此链表定义了迭代顺序,通常是按照条目插入到映射中的顺序(插入顺序)。注意,如果此映射由于重新插入(重新插入键/值对)而导致结构修改,则迭代顺序可能会受到影响。
3、TreeMap:它基于红黑树实现,可以保证按照键的自然顺序或创建 TreeMap 时提供的 Comparator 进行排序。
如果你发现你的 Map 遍历结果看起来像是“倒序”的,并且你没有使用 LinkedHashMap 或 TreeMap,那么这可能是由于你使用的 Map 实现(很可能是 HashMap)的内部结构导致的。
为了获得特定的遍历顺序,你应该选择适当的 Map 实现。如果你想要保持插入顺序,那么应该使用 LinkedHashMap。如果你想要按照键的排序顺序遍历,那么应该使用 TreeMap。
TreeMap<String, Integer> treeMap = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 这里我们按照字符串长度的逆序来排序
return Integer.compare(o2.length(), o1.length());
}
});
treeMap.put("one", 1);
treeMap.put("two", 2);
treeMap.put("three", 3);
treeMap.put("four", 4);
// 输出结果将按照键的字符串长度的逆序来排序
treeMap.forEach((key, value) -> System.out.println("treeMap "+key + ": " + value));
System.out.println("treeMap 自定义排序规则 按照字符串长度的逆序来排序");
标签:Map,遍历,HashMap,treeMap,TreeMap,顺序
From: https://www.cnblogs.com/sunny3158/p/18282450