HashMap本身无序,需转换为TreeMap(按键排序)或用Stream/Collections.sort(按值排序),结果均为新集合副本,不改变原Map。

HashMap 本身是无序的,不能直接排序。但可以通过转换或借助其他集合类型实现按 Key 或 Value 排序,核心思路是:提取键值对 → 按需比较 → 存入有序结构或排序后遍历。
按 Key 排序(自然顺序或自定义)
最常用且简洁的方式是用 TreeMap,它默认按 Key 的自然顺序(如字符串字典序、数字升序)排序:
- 直接构造:
new TreeMap(originalMap),自动按键排序 - 支持自定义比较器,例如按字符串长度排序:
new TreeMap((k1, k2) -> Integer.compare(k1.length(), k2.length())) - 注意:TreeMap 不允许 key 为 null;若原 HashMap 含 null key,需先过滤
按 Value 排序(升序、降序或复合规则)
Value 没有天然顺序,必须显式指定比较逻辑。推荐使用 Stream API(Java 8+):
- 升序:
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(...)) - 降序:
sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) - Value 相同时再按 Key 排序:
sorted(Map.Entry.<string integer>comparingByValue().thenComparing(Map.Entry::getKey))</string> - 收集结果建议用 LinkedHashMap,保持排序后的插入顺序
手动转 List + Collections.sort(兼容老版本 Java)
适用于 Java 7 及更早环境,或需要精细控制排序过程时:
- 提取
entrySet()到ArrayList<map.entry>></map.entry> - 用
Collections.sort(list, comparator),自定义 comparator 比较 value 或 key - 遍历时按 list 顺序输出,不改变原 map
- 示例中 comparator 返回
o1.getValue().compareTo(o2.getValue())即按 value 升序
注意事项与常见误区
排序结果不是原 HashMap 的“变身”,而是新结构的副本:
- TreeMap 和 LinkedHashMap 是新的 Map 实例,修改它们不影响原 HashMap
- Stream.collect 或 Collections.sort 生成的是临时视图或新容器,非实时同步
- 按 value 排序时,若 value 类型不可比较(如自定义对象),需提供显式 Comparator
- 避免在多线程环境中直接共享排序结果,除非使用线程安全包装(如
Collections.synchronizedMap)


















