java集合排序核心是collections.sort()配合comparator,支持字段升降序、多字段、null值处理及自定义逻辑,需确保list可变。

Java集合排序在业务开发中很常见,核心是用好Collections.sort()配合Comparator——它不依赖元素自身实现Comparable,灵活适配各种排序逻辑。
按对象字段升序/降序排序
业务中常需按用户年龄、订单金额、创建时间等字段排序。直接传入Lambda表达式最简洁:
- 升序:
Collections.sort(list, Comparator.comparing(User::getAge)); - 降序:
Collections.sort(list, Comparator.comparing(User::getAge).reversed()); - 多字段:先按部门升序,再按薪资降序:
Comparator.comparing(User::getDept).thenComparing(User::getSalary, Comparator.reverseOrder())
处理null值避免空指针
业务数据常含null(如未填手机号、暂无审核时间),直接比较会抛NullPointerException。用Comparator.nullsFirst()或Comparator.nullsLast()显式控制位置:
Collections.sort(list, Comparator.comparing(User::getPhone, Comparator.nullsLast(String::compareTo)));- null放在最前:
Comparator.nullsFirst(Comparator.naturalOrder()) - null放在最后:
Comparator.nullsLast(Comparator.naturalOrder())
自定义复杂排序逻辑
当排序规则无法用字段链式调用表达(比如“VIP用户优先,同为VIP则按积分降序,普通用户按注册时间升序”),可写匿名类或独立Comparator实现:
- 用Lambda写多条件判断:
(u1, u2) -> { if (u1.isVip() && !u2.isVip()) return -1; if (!u1.isVip() && u2.isVip()) return 1; return u1.isVip() ? Integer.compare(u2.getPoints(), u1.getPoints()) : u1.getRegisterTime().compareTo(u2.getRegisterTime()); } - 提取为独立类更易测试和复用,尤其规则频繁变更时
注意List必须是可变的
Collections.sort()是就地排序,要求传入的List支持修改。常见陷阱:
-
Arrays.asList()返回的List不能add/remove,但可以sort(因底层是数组) -
List.of()或Collections.unmodifiableList()返回不可变List,调用sort会抛UnsupportedOperationException - 安全做法:不确定来源时先复制,
new ArrayList(originalList)
不复杂但容易忽略细节,把Comparator想成“告诉sort怎么比”,而不是“让对象自己比”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











