collections.sort() 是 java 中原地排序 list 的核心工具,支持自然排序、lambda 自定义比较器、多字段链式组合及 null 安全处理,覆盖绝大多数业务场景。

Java 中 Collections.sort() 是最常用、最直接的列表排序工具,它不创建新集合,而是原地修改 List,适用于 ArrayList、LinkedList 等所有 List 实现类。掌握它的自然排序、自定义比较器、多字段组合和空值处理,就能覆盖绝大多数业务排序需求。
基础自然排序:适合 String、Integer 等内置类型
当 List 元素类型已实现 Comparable(如 String、Integer、Double),直接调用单参数版本即可升序排列:
-
String按字典序(Unicode 值)升序,如"apple"在"banana"前 -
Integer按数值大小升序,3在10前 - 注意:List 不能为
null,且元素也不能全为null,否则抛NullPointerException
Lambda 表达式自定义排序:简洁高效写法
Java 8+ 推荐用 Lambda 替代匿名内部类,逻辑一目了然:
- 按字符串长度升序:
Collections.sort(words, (a, b) -> a.length() - b.length()) - 按整数字段降序(如年龄):
Collections.sort(people, (p1, p2) -> p2.getAge() - p1.getAge()) - 避免整数溢出更安全的写法:
Integer.compare(p1.getAge(), p2.getAge())或Comparator.reverseOrder()
多字段组合排序:逐级判断或链式构建
业务中常需“先按年龄升序,年龄相同时按分数降序,再按姓名忽略大小写升序”:
- 手写逻辑清晰易读:
if (ageCmp != 0) return ageCmp;后续接 score、name 判断 - 推荐复用链式构建:
Comparator.comparing(User::getAge).thenComparing(User::getScore, Comparator.reverseOrder()).thenComparing(User::getName, String.CASE_INSENSITIVE_ORDER) - 可声明为
public static final Comparator<user></user>常量,便于测试与跨模块共享
空值与异常处理:生产环境必须考虑
真实数据常含 null 字段,直接比较会报错:
- 用
Comparator.nullsFirst()或Comparator.nullsLast()显式控制null位置 - 例如:分数可能为
null,希望排在末尾且降序 —— 写成thenComparing(User::getScore, Comparator.nullsLast(Comparator.reverseOrder())) - 排序前建议校验 List 是否为空或只含
null,避免运行时崩溃
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











