hashmap本身无序,排序需借助treemap(按键自然/自定义序)或对entryset()排序后存入linkedhashmap;按键排序用comparingbykey(),按值排序用comparingbyvalue()及reversed(),注意null处理与并发安全。

HashMap 本身是无序的,不保证插入顺序,也不支持按键或按值直接排序。要实现排序,需要借助其他数据结构(如 TreeMap、LinkedHashMap)或对 entrySet() 进行排序后重建映射。
按键排序(自然顺序或自定义顺序)
最常用方式是将 HashMap 的 entry 转为 List,用 Collections.sort() 或 Stream.sorted() 按 key 排序,再放入 LinkedHashMap 保持顺序:
- 使用
TreeMap:自动按键升序排列(key 必须实现Comparable或传入Comparator) - 手动排序(更灵活):适合需要降序、自定义规则,或 key 不可比较的情况
示例(升序按键):
Map<string integer> original = new HashMap();
original.put("banana", 3);
original.put("apple", 1);
original.put("cherry", 2);
// 方式1:TreeMap(自然顺序)
Map<string integer> sortedByKey = new TreeMap(original);
// 方式2:Stream + LinkedHashMap(支持任意 Comparator)
Map<string integer> sortedByKey2 = original.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1, // 冲突时保留前者
LinkedHashMap::new
));</string></string></string>
按值排序(升序/降序/自定义逻辑)
值排序无法用 TreeMap 直接实现(TreeMap 是按键排序),必须基于 entrySet() 排序:
- 用
Map.Entry.comparingByValue()实现升序;加reversed()得降序 - 注意:如果多个 key 对应相同 value,排序结果中它们的相对顺序不保证(除非用
thenComparingByKey()稳定化) - 值类型需实现
Comparable;否则需传入显式Comparator
示例(按值降序):
Map<string integer> sortedByValue = original.entrySet().stream()
.sorted(Map.Entry.<string integer>comparingByValue().reversed())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));</string></string>
注意事项和常见陷阱
排序后的结果一定是新 Map(如 LinkedHashMap),原 HashMap 不受影响。
- 不要用
HashMap接收排序结果——它会打乱顺序 - 避免在排序中修改原 Map(如边遍历边 remove),可能引发
ConcurrentModificationException - 若 key 或 value 为
null,按值排序时comparingByValue()会抛NullPointerException;需用Comparator.nullsLast()或预处理过滤 - 大数据量时,流式排序性能略低于传统 for+list.sort(),但代码更简洁
简单封装成工具方法(可复用)
可以写两个静态方法,让调用更直观:
public static <k extends comparable super v>>
Map<k v> sortByValue(Map<k v> map, boolean ascending) {
return map.entrySet().stream()
.sorted(ascending ?
Map.Entry.comparingByValue() :
Map.Entry.<k v>comparingByValue().reversed())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
}</k></k></k></k>
调用:sortByValue(original, false) 即得按值降序的 Map。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











