Java集合排序最常用Collections.sort(),默认按自然顺序,自定义规则需传入Comparator;早期用匿名内部类实现compare方法,Java 8后可用Lambda简化,推荐使用List.sort(),注意空指针、溢出及比较器三大性质。

Java中对集合排序,最常用的是Collections.sort()方法。它默认按自然顺序排序(要求元素实现Comparable接口),但更多场景下需要自定义规则——这时可通过传入Comparator实现,而匿名内部类是早期Java版本中最直观的写法。
Comparator接口与匿名内部类写法
Comparator是一个函数式接口,只定义了一个抽象方法compare(T o1, T o2),返回负数、0或正数分别表示“小于”、“等于”、“大于”。使用匿名内部类时,直接在sort()调用中new出实现类:
- 比较逻辑写在
compare()方法内,注意避免空指针(尤其当元素可能为null时) - 返回值必须严格符合语义:o1排在o2前 → 返回负数;相等 → 返回0;o1排在o2后 → 返回正数
- 示例:对
List<String>按长度降序排列
public int compare(String s1, String s2) {
return s2.length() - s1.length(); // 注意顺序,实现降序
}
});
常见排序逻辑写法要点
实际开发中,排序条件往往不止一个。比如先按年龄升序,年龄相同时按姓名字典序降序。此时需在compare()中分步判断:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先比较主字段,若不等直接返回结果
- 主字段相等时,再比较次字段(可用
Integer.compare()、String.compareTo()等工具方法避免手算) - 避免直接用减法(如
a - b)比较整数,可能溢出;优先用Integer.compare(a, b)
从匿名内部类到Lambda表达式的演进
Java 8引入Lambda后,相同逻辑可大幅简化:
立即学习“Java免费学习笔记(深入)”;
- 单方法接口 + 参数类型可推断 → 可省略接口名和参数类型
- 上面的长度降序可写成:
Collections.sort(list, (s1, s2) -> s2.length() - s1.length()) - 更推荐使用
List.sort()替代Collections.sort()(JDK 8+),语义更清晰
注意事项与避坑点
自定义排序看似简单,但容易忽略边界情况:
- 确保
compare()满足自反性(compare(x,x)==0)、对称性(compare(x,y)与compare(y,x)符号相反)、传递性 - 不要在比较器中修改被比较对象的状态,否则可能引发不可预测行为
- 若集合含null元素,需主动处理(如用
Comparator.nullsFirst()或手动判空),否则抛NullPointerException

















