java集合排序核心是collections.sort()配合comparator,关键在于比较逻辑与边界处理;支持单字段升降序、多字段链式组合、null值兜底及自定义复用,需注意稳定性、list限制和不可变集合拷贝。

Java中对集合排序,核心是用Collections.sort()配合自定义Comparator,关键不在写法多复杂,而在比什么、怎么比、边界怎么处理。
按单个字段升序/降序最简写法
比如List
Collections.sort(users, (u1, u2) -> Integer.compare(u1.getAge(), u2.getAge()));
降序就交换参数或加负号:
(u1, u2) -> Integer.compare(u2.getAge(), u1.getAge())(u1, u2) -> -Integer.compare(u1.getAge(), u2.getAge())
注意别用u1.getAge() - u2.getAge(),整数溢出时会翻车。
多字段组合排序有先后级
先按部门升序,部门相同时按薪资降序,写成链式调用更清晰:
Collections.sort(users, Comparator.comparing(User::getDept)
.thenComparing(User::getSalary, Comparator.reverseOrder()));
等价于手动写逻辑:
- 先比
dept,不等就返回结果 - 相等再比
salary,用reverseOrder()实现降序
字段为null时默认抛异常,需提前用Comparator.nullsFirst()或nullsLast()兜底。
自定义Comparator复用与封装
如果某排序逻辑在多处使用(如按姓名拼音排序),建议单独写类或静态方法:
public class PinyinNameComparator implements Comparator<user> {
@Override
public int compare(User u1, User u2) {
return PinyinUtil.toPinyin(u1.getName()).compareTo(PinyinUtil.toPinyin(u2.getName()));
}
}</user>
调用时直接传入:
Collections.sort(users, new PinyinNameComparator());- 或用方法引用:
Collections.sort(users, PinyinNameComparator::new);
避免重复写Lambda,也方便单元测试和维护。
排序稳定性与不可变集合注意事项
Collections.sort()是稳定排序,相同元素相对位置不变。但要注意:
- 只适用于
List,对Set或Map键值本身无序,需转成List再排 - 若原List是不可变集合(如
Arrays.asList()返回的),排序会报UnsupportedOperationException,得先拷贝:new ArrayList(list) - 原始类型数组用
Arrays.sort(),别混用
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











