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></string>按长度降序排列
public int compare(String s1, String s2) {
return s2.length() - s1.length(); // 注意顺序,实现降序
}
});
常见排序逻辑写法要点
实际开发中,排序条件往往不止一个。比如先按年龄升序,年龄相同时按姓名字典序降序。此时需在compare()中分步判断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先比较主字段,若不等直接返回结果
- 主字段相等时,再比较次字段(可用
Integer.compare()、String.compareTo()等工具方法避免手算) - 避免直接用减法(如
a - b)比较整数,可能溢出;优先用Integer.compare(a, b)
从匿名内部类到Lambda表达式的演进
Java 8引入Lambda后,相同逻辑可大幅简化:
- 单方法接口 + 参数类型可推断 → 可省略接口名和参数类型
- 上面的长度降序可写成:
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
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










