collections.sort() 是 java 中原地排序 list 的常用方法,支持自然排序(如 string 按字典序、integer 按数值升序)和 comparator 自定义排序,覆盖多数业务场景。

Collections.sort() 是 Java 中对 List 集合排序最直接、最常用的工具,它不创建新列表,而是原地修改原有 List,适用于大多数业务场景。掌握自然排序与 Comparator 自定义排序两种方式,就能覆盖字符串、数字、对象等绝大多数排序需求。
自然排序:适用于 String、Integer 等内置类型
当 List 元素是 String、Integer、Double 等已实现 Comparable 接口的类型时,直接调用 Collections.sort(list) 即可按默认规则升序排列。
- String 按字典序(Unicode 顺序)排序,如 "Apple"
- Integer、Long 等按数值大小排序,不会出现 "10"
- 要求 list 本身可修改(不能是 Arrays.asList() 返回的不可变视图或 Collections.unmodifiableList() 包装的结果)
自定义排序:用 Comparator 控制逻辑
当需要按字段、降序、多条件或处理未实现 Comparable 的类时,传入 Comparator 是标准做法。Java 8 后推荐使用 Lambda 或 Comparator 静态方法链式调用。
- 按字符串长度:Collections.sort(words, Comparator.comparingInt(String::length))
- 按对象属性升序:Collections.sort(people, Comparator.comparing(Person::getAge))
- 多字段组合:Comparator.comparing(Person::getAge).thenComparing(Person::getName)
- 空值安全:在链末尾加 .nullsLast() 或 .nullsFirst(),避免 NullPointerException
关键注意事项
忽略这些细节容易导致运行时异常或逻辑错误。
- 该方法只支持 List,对 Set、Map、Queue 不适用;若需对 Map 的键或值排序,应先转为 List
- 排序会改变原始列表——如需保留原数据,务必先 new ArrayList(originalList)
- 元素含 null 时,自然排序会抛 NullPointerException;使用 Comparator 时可通过 nullsLast() 显式处理
- 底层使用 TimSort(稳定、O(n log n)),适合中小规模数据;超大数据量且追求极致性能时,可考虑并行流 sorted() 或外部排序策略
替代方案提示
Java 8+ 提供了更现代的写法,语义更清晰,尤其适合函数式风格:
- List.sort(comparator):直接调用 List 接口的默认方法,无需静态导入,部分 IDE 泛型推导更准
- Stream.sorted():返回新 Stream,适合链式操作,如 list.stream().sorted(comparator).collect(Collectors.toList())
- 两者底层均基于 TimSort,性能一致,选择取决于是否需要不可变结果或是否已在 Stream 流程中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











