HashMap
在 Java 中本质上是不保证任何顺序的,特别是它不保证元素会按照插入的顺序进行存储或遍历。如果需要维护元素的插入顺序,可以使用 LinkedHashMap
,它在内部通过维护一个双向链表来保持插入顺序。如果想要按照键的自然顺序或者自定义的比较器顺序来存储和遍历键值对,可以使用 TreeMap
。
以下是解决 HashMap
不按序问题的几种方法:
使用 LinkedHashMap
LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(1, "one");
linkedHashMap.put(2, "two");
linkedHashMap.put(3, "three");
for (Map.Entry<Integer, String> entry : linkedHashMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
使用 TreeMap
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(1, "one");
treeMap.put(2, "two");
treeMap.put(3, "three");
for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
使用 Java 8 的 Stream
API 对 HashMap
进行排序
HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(3, "three");
hashMap.put(1, "one");
hashMap.put(2, "two");
// 按键排序
hashMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(e -> System.out.println(e.getKey() + ": " + e.getValue()));
// 按值排序
hashMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.forEachOrdered(e -> System.out.println(e.getKey() + ": " + e.getValue()));