collections.sort 是 java 中直接修改原 list 的排序方法,支持自然排序、自定义比较器、多字段链式排序及 null 值处理,但仅适用于可修改的 list,不可用于 set/map 或不可变列表。

Collections.sort 是 Java 中对 List 排序最直接、最常用的方式,它不创建新列表,而是直接修改原集合。关键不在“能不能排”,而在于怎么排得准、稳、可维护。
自然排序:元素自带规则就足够
如果 List 里是 String、Integer、LocalDate 等已实现 Comparable 的类型,直接调用 Collections.sort(list) 即可升序排列。比如:
- String 按字典序(a
- Integer 按数值大小(1
- LocalDateTime 按时间先后
注意:列表必须非 null,且元素不能为 null(否则抛 NullPointerException),尤其在读数据库或解析 JSON 后需提前校验或过滤。
自定义排序:用 Comparator 控制逻辑
对字符串按长度、对对象按字段、多条件组合排序,都靠传入 Comparator。Java 8+ 推荐用 Lambda,清晰又少出错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 按字符串长度:Collections.sort(words, (a, b) -> Integer.compare(a.length(), b.length()))
- 按 Person 年龄降序:Collections.sort(people, (p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()))
- 忽略大小写比姓名:Collections.sort(names, String.CASE_INSENSITIVE_ORDER::compare)
避免用 a.length() - b.length() 这类减法,整数溢出时会翻转结果;一律用 Integer.compare、Double.compare 等安全方法。
多字段排序:链式构建更可靠
业务中常需“先按部门升序,再按薪资降序,最后按入职时间升序”。这时用 Comparator 静态链式构造,比嵌套 if 更易读、可复用:
- Comparator.comparing(Person::getDept).thenComparing(Person::getSalary, Comparator.reverseOrder()).thenComparing(Person::getHireDate)
- null 值必须显式处理:用 Comparator.nullsFirst 或 Comparator.nullsLast 包裹子比较器,例如 thenComparing(Person::getName, Comparator.nullsLast(String::compareTo))
建议把这类复合比较器抽成 public static final 常量,便于测试和跨模块共享。
注意事项:别踩这些常见坑
Collections.sort 只支持 List,不支持 Set 或 Map 直接排序;它修改原列表,不是返回新 List;若 List 是不可变的(如 List.of()、Arrays.asList() 返回的固定大小列表),运行时会抛 UnsupportedOperationException。
- 确保 list 是可修改的 ArrayList 或 LinkedList
- 排序前检查 null 元素,或在比较器中统一兜底(如 Objects.equals 或 Objects.nonNull)
- 大数据量时性能良好(底层是 Timsort),但若需函数式风格或不改原集合,可考虑 list.stream().sorted(comparator).collect(Collectors.toList())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










