在Java中,Collections.sort是java.util.Collections类提供的静态排序方法,能够对List接口的实现类集合进行原地排序,默认按照元素的自然顺序升序排列,也支持通过自定义比较规则实现任意维度的排序需求。

一、Collections.sort的基本用法
Collections.sort最直接的使用方式是不传递额外比较参数,此时要求集合中的元素必须实现Comparable接口,重写compareTo方法定义自然排序规则。
1.1 基本数据类型集合排序
Java中的包装类如Integer、String等都已经实现了Comparable接口,因此可以直接对这类元素的集合排序:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SortDemo {
public static void main(String[] args) {
// 创建整数集合
List<Integer> numList = new ArrayList<>();
numList.add(3);
numList.add(1);
numList.add(4);
numList.add(2);
System.out.println("排序前:" + numList);
// 默认升序排序
Collections.sort(numList);
System.out.println("排序后:" + numList);
// 字符串集合排序,按字典顺序升序
List<String> strList = new ArrayList<>();
strList.add("banana");
strList.add("apple");
strList.add("cherry");
Collections.sort(strList);
System.out.println("字符串排序后:" + strList);
}
}
上述代码执行后,整数集合会输出[1,2,3,4],字符串集合会输出[apple, banana, cherry]。
1.2 自定义类集合的自然排序
如果要对自定义类的集合使用默认排序,需要让自定义类实现Comparable接口,指定排序规则:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// 自定义学生类,实现Comparable接口,按年龄升序排序
class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 重写compareTo方法,定义排序规则
@Override
public int compareTo(Student o) {
// 当前对象年龄小于对比对象年龄,返回负数,排前面
// 相等返回0,大于返回正数,排后面
return this.age - o.age;
}
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
public class CustomSortDemo {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("张三", 20));
studentList.add(new Student("李四", 18));
studentList.add(new Student("王五", 22));
System.out.println("排序前:" + studentList);
Collections.sort(studentList);
System.out.println("按年龄升序排序后:" + studentList);
}
}
二、使用自定义比较器实现灵活排序
当默认的排序规则不满足需求,或者不想修改自定义类的Comparable实现时,可以使用Comparator接口自定义比较规则,将其作为参数传递给Collections.sort方法。
2.1 基于Comparator的临时排序规则
以下示例演示如何对学生集合按姓名降序排序,不需要修改Student类的代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
public class ComparatorSortDemo {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("张三", 20));
studentList.add(new Student("李四", 18));
studentList.add(new Student("王五", 22));
// 使用匿名内部类实现Comparator,按姓名降序排序
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 字符串降序,反转比较结果
return o2.getName().compareTo(o1.getName());
}
});
System.out.println("按姓名降序排序后:" + studentList);
// Java 8之后可以使用lambda表达式简化写法,按年龄降序排序
Collections.sort(studentList, (s1, s2) -> s2.getAge() - s1.getAge());
System.out.println("按年龄降序排序后:" + studentList);
}
}
2.2 多条件排序场景
实际业务中经常需要多条件排序,比如先按年龄升序,年龄相同再按姓名升序,也可以通过Comparator实现:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
public class MultiConditionSort {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("张三", 20));
studentList.add(new Student("李四", 18));
studentList.add(new Student("王五", 20));
studentList.add(new Student("赵六", 18));
// 先按年龄升序,年龄相同按姓名升序
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 先比较年龄
int ageCompare = o1.getAge() - o2.getAge();
if (ageCompare != 0) {
return ageCompare;
}
// 年龄相同再比较姓名
return o1.getName().compareTo(o2.getName());
}
});
System.out.println("多条件排序后:" + studentList);
}
}
三、Comparable与Comparator的区别
很多开发者会混淆这两个接口,二者的核心区别如下:
| 对比维度 | Comparable | Comparator |
|---|---|---|
| 包位置 | java.lang | java.util |
| 排序规则归属 | 定义在元素类内部,属于元素的自然排序规则 | 定义在元素类外部,属于临时或扩展的排序规则 |
| 方法定义 | 重写compareTo(T o)方法 | 重写compare(T o1, T o2)方法 |
| 使用场景 | 类有固定、默认的排序规则时使用 | 需要灵活切换排序规则,或不希望修改元素类代码时使用 |
四、注意事项
- Collections.sort只能对List集合排序,Set、Map等集合不支持,若需要对这类集合排序,需要先转换为List。
- 排序的集合不能为null,且集合中的元素也不能为null,否则会抛出NullPointerException。
- Collections.sort的排序是原地排序,会直接修改原集合的顺序,若需要保留原集合,需要先复制一份再排序。
- 自定义比较规则时,要保证比较逻辑的一致性,避免出现compare(a,b)=0但a.equals(b)为false的情况,否则可能导致排序结果不符合预期。
提示:Java 8之后List接口新增了sort方法,功能和Collections.sort一致,也可以直接使用list.sort(comparator)的方式排序,本质都是调用了Arrays.sort的适配实现。
Collections.sortJava集合排序ComparatorComparable自定义比较器修改时间:2026-06-20 13:03:45