Collections.sort()用于对List集合排序,基于稳定算法支持自然排序和自定义比较器排序。

在Java中,Collections.sort() 是对集合进行排序的常用方法,适用于实现了 List 接口的集合类型,如 ArrayList、LinkedList 等。它基于稳定的排序算法(归并排序或优化的快速排序),能够高效地对元素进行自然排序或自定义排序。
使用自然排序(元素实现Comparable接口)
若集合中的元素类型已经实现了 Comparable 接口(如 String、Integer 等),可直接调用 Collections.sort(list) 进行升序排序。
示例:- 创建一个字符串列表:List
words = Arrays.asList("banana", "apple", "cherry"); - 调用排序方法:Collections.sort(words);
- 结果将按字典顺序排列:["apple", "banana", "cherry"]
注意:要求集合中所有元素必须支持 Comparable,否则运行时会抛出 ClassCastException。
使用自定义比较器(Comparator)
当需要按照特定规则排序,或元素未实现 Comparable 时,可以传入一个 Comparator 实现自定义排序逻辑。
立即学习“Java免费学习笔记(深入)”;
示例:按字符串长度排序- 定义比较器:Collections.sort(words, (a, b) -> a.length() - b.length());
- 也可使用方法引用:Collections.sort(words, Comparator.comparing(String::length));
- 结果将按长度从小到大排列:如 "hi", "cat", "hello"
支持链式比较,例如先按长度再按字母排序:Comparator.comparing(String::length).thenComparing(Comparator.naturalOrder())
排序对象集合
对自定义对象(如 Person、Student)排序时,推荐使用 Comparator,避免修改类结构实现 Comparable。
示例:按年龄排序学生列表- 假设 Student 类有 getName() 和 getAge() 方法
- 排序代码:Collections.sort(students, Comparator.comparing(Student::getAge));
- 降序排列可用 reversed():Comparator.comparing(Student::getAge).reversed()
多个字段排序也很直观,比如先按年龄升序,再按姓名字母排序:.thenComparing(Student::getName)
注意事项与最佳实践
使用 Collections.sort() 时需注意以下几点:
- 集合必须是可变的 List,且不能包含 null 元素(除非比较器专门处理)
- 空集合或只有一个元素的集合也能安全调用,不会报错
- 排序是原地操作,会修改原始列表
- 对于 Set 或 Map,需先转为 List 再排序
- Java 8+ 更推荐使用 List 的 sort() 方法或 Stream API,如 list.sort(comparator)
基本上就这些。掌握自然排序和 Comparator 的使用,就能灵活应对大多数排序需求。不复杂但容易忽略的是 null 值处理和不可变集合的问题,实际开发中建议提前判断或使用 Objects.requireNonNull。










