HashMap本身不支持排序,需借助TreeMap、TreeSet或Stream等额外处理实现按键或值排序,且原Map不受影响。

HashMap 本身不支持排序,它基于哈希表实现,插入顺序和遍历顺序都不保证。若需对键或值排序,必须借助其他数据结构或工具类进行“额外处理”。
按键(Key)排序
最常用方式是将 HashMap 的 keySet 转为 TreeSet(自动升序)或用 TreeMap 包装:
- 使用 TreeMap 构造器:`new TreeMap(originalMap)` —— 直接按 key 自然序排序(key 必须实现 Comparable,或传入 Comparator)
- 手动提取 key 并排序:`List<K> keys = new ArrayList<>(map.keySet()); Collections.sort(keys);`,再按序遍历 `map.get(k)`
- Java 8+ 推荐流式写法:
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));
按值(Value)排序
值通常不唯一,也不能直接用 TreeSet 或 TreeMap(value 不是键),需手动排序 entry 集合:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 转成 List<Map.Entry> 后按 value 排序:
List<Map.Entry<K,V>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, (e1, e2) -> ((Comparable)V) e1.getValue()).compareTo(e2.getValue())); - Java 8+ 流式更简洁:
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.forEach(System.out::println);
(注意:value 类型必须可比较,否则要传 Comparator) - 若 value 是自定义对象,需确保其重写
compareTo()或提供外部 Comparator,例如:
.sorted(Map.Entry.comparingByValue(Comparator.comparing(Person::getAge)))
保持插入顺序 + 后续排序?考虑 LinkedHashMap
如果既要有序输出,又想保留原始插入逻辑,可先用 LinkedHashMap 存储已排序的结果:
立即学习“Java免费学习笔记(深入)”;
- 排序后收集进 LinkedHashMap:
Map<K,V> sortedMap = map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new)); - 这样得到的 map 遍历时就是排序后的顺序,且是可迭代的 Map 实例
注意点与常见误区
- HashMap 的
keySet()、values()、entrySet()返回的集合不保证顺序,不能依赖其迭代顺序 - TreeMap 按 key 排序,不是按插入顺序;LinkedHashMap 才能保序(插入序或访问序)
- 按 value 排序时,若 value 为 null,会抛
NullPointerException,需提前过滤或处理 - 排序结果是临时视图,原 HashMap 不受影响;如需持久化排序结构,请显式构造新 Map

















