HashMap本身不维护顺序,按键排序用TreeMap,按值排序需转Stream并用comparingByValue,仅需键/值列表时先转ArrayList再排序。

按键(key)排序
最简单可靠的方式是用 TreeMap:它底层是红黑树,插入时自动按键的自然顺序(如字符串字典序、数字大小)排序。
- 直接构造:
new TreeMap(originalMap),适用于 key 实现了Comparable(如 String、Integer) - 自定义规则:传入
Comparator,比如忽略大小写排序:new TreeMap(String.CASE_INSENSITIVE_ORDER) - 注意:TreeMap 只保证按键有序,不保留原 HashMap 的插入顺序;如果 key 为 null,会抛
NullPointerException
按值(value)排序
Map 没有内置按值排序机制,因为值不唯一、也不参与哈希计算。必须手动提取 entry 集合,再排序。
- 推荐用 Stream API(Java 8+):简洁安全,一行核心逻辑
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(...)) - 需要保持顺序输出?用
LinkedHashMap::new作为 collector 的 map factory - 值类型不是 Comparable?比如自定义对象,要传入显式
Comparator,例如:comparing(e -> e.getValue().getScore()) - 避免陷阱:不要在遍历 HashMap 时边找最小值边 remove——容易抛
ConcurrentModificationException或逻辑错乱
只想要排序后的键或值列表
如果不需要新 Map,只是想拿到排好序的 key 列表或 value 列表,更轻量:
- 按键排序列表:
new ArrayList(map.keySet()).stream().sorted().toList() - 按值排序的键列表:
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).map(Map.Entry::getKey).toList() - 注意:
keySet()和values()返回的是视图,不能直接排序;必须先转成ArrayList或走 Stream
为什么不直接用 Collections.sort(map.entrySet())?
map.entrySet() 返回的是 Set,不是 List,而 Collections.sort() 只接受 List。所以必须先转成 ArrayList 或 LinkedList,再排序——这也是很多老教程里看到 new ArrayList(map.entrySet()) 的原因。
立即学习“Java免费学习笔记(深入)”;


















