Java集合排序依赖Comparable(自然排序)和Comparator(定制排序)接口,配合Collections或Stream API实现;需注意null处理、不可变集合限制及线程安全。

Java 中对集合排序主要依靠 Comparable 和 Comparator 两大接口,配合 Collections 或 Stream API 使用。核心在于明确“按什么排”和“怎么排”,而不是简单调用 sort 方法。
使用 Comparable 接口实现自然排序
当集合元素自身具备明确、唯一的大小逻辑(如 Student 按学号、String 按字典序),可让类实现 Comparable 接口并重写 compareTo() 方法。
- 必须返回负数、0 或正数,分别表示“小于”、“等于”、“大于”
- 排序时直接调用
Collections.sort(list)或list.sort(null)即可 - 注意:该方式修改的是原集合,且要求所有元素非 null(否则抛 NullPointerException)
例如:Person 类实现 Comparable 后,Collections.sort(people) 就按姓名升序排列。
使用 Comparator 接口实现定制排序
当需要多种排序规则(如按年龄、按姓名长度、降序)、或无法修改元素类源码时,用 Comparator 更灵活。
立即学习“Java免费学习笔记(深入)”;
- 可匿名内部类、Lambda 表达式或方法引用定义比较器
-
Collections.sort(list, comparator)或list.sort(comparator) - Stream API 中用
sorted(comparator)返回新流,不修改原集合
例如:按年龄降序: list.sort((a, b) -> Integer.compare(b.getAge(), a.getAge()))
对 Map 的键或值排序
Map 本身无序(HashMap)或按插入顺序(LinkedHashMap),排序需转为 List 处理:
- 按 key 排序:用
new TreeMap(originalMap)(要求 key 实现 Comparable) - 按 value 排序:将
entrySet()转为 List,再用Comparator.comparing(Map.Entry::getValue)排序 - Java 8+ 可链式操作:
map.entrySet().stream().sorted(comparingByValue()).collect(toMap(...))
注意 null 值与不可变集合
排序前务必确认数据质量:
- 含 null 元素时,
Comparable默认会报错;可用Comparator.nullsFirst()或nullsLast()显式处理 - Arrays.asList() 返回的列表、Collections.unmodifiableList() 等不可变集合,调用 sort 会抛 UnsupportedOperationException
- 多线程环境下,排序前建议确保集合未被并发修改,必要时加锁或使用线程安全集合










