在 Java 中,Map 本身不保证键的顺序(HashMap 是无序的,LinkedHashMap 按插入顺序排序),如果需要对 Map 的键进行排序,通常有以下几种方法:

方法 1:使用 TreeMap(自然排序或自定义排序)
TreeMap 会自动按键的自然顺序(如数字从小到大,字符串字典序)排序,或者通过 Comparator 自定义排序规则。
示例代码
import java.util.*;
public class MapSortExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("banana", 3);
map.put("apple", 1);
map.put("orange", 2);
// 使用 TreeMap 按键自然排序(字典序)
Map<String, Integer> sortedMap = new TreeMap<>(map);
System.out.println("按键自然排序:" + sortedMap);
// 自定义排序规则(如按字符串长度排序)
Map<String, Integer> customSortedMap = new TreeMap<>(Comparator.comparingInt(String::length));
customSortedMap.putAll(map);
System.out.println("按字符串长度排序:" + customSortedMap);
}
}
输出
按键自然排序:{apple=1, banana=3, orange=2}
按字符串长度排序:{apple=1, orange=2, banana=3}
方法 2:使用 Stream(Java 8+)
如果不想使用 TreeMap,可以用 Stream 对 Map 的键进行排序,然后收集到新的 LinkedHashMap(保持排序顺序)。
示例代码
import java.util.*;
import java.util.stream.*;
public class MapSortExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("banana", 3);
map.put("apple", 1);
map.put("orange", 2);
// 按键自然排序
Map<String, Integer> sortedMap = map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
System.out.println("按键自然排序:" + sortedMap);
// 自定义排序(按字符串长度)
Map<String, Integer> customSortedMap = map.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.comparingInt(String::length)))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
System.out.println("按字符串长度排序:" + customSortedMap);
}
}
输出
按键自然排序:{apple=1, banana=3, orange=2}
按字符串长度排序:{apple=1, orange=2, banana=3}
方法 3:对 HashMap 的键进行排序并输出
如果只是需要排序后的键列表(不关心值),可以直接对 keySet() 进行排序。
示例代码
import java.util.*;
public class MapSortExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("banana", 3);
map.put("apple", 1);
map.put("orange", 2);
// 获取键列表并排序
List<String> sortedKeys = new ArrayList<>(map.keySet());
Collections.sort(sortedKeys);
System.out.println("排序后的键:" + sortedKeys);
}
}
输出
排序后的键:[apple, banana, orange]
| 方法 | 适用场景 | 特点 |
|---|---|---|
TreeMap |
需要自动排序的 Map | 自动排序,支持自然顺序或自定义 Comparator |
Stream + LinkedHashMap |
需要灵活排序(如按值排序) | 适用于复杂排序逻辑,需 Java 8+ |
Collections.sort(keySet()) |
只需要排序后的键列表 | 简单直接,但不返回新的 Map |
选择哪种方式取决于你的具体需求:

- 如果需要始终有序的 Map,用
TreeMap。 - 如果需要临时排序或复杂逻辑,用
Stream。 - 如果只需要排序后的键列表,直接排序
keySet()。

