核心方法
- 使用
Collections.sort()(传统方法) - 使用
List.sort()(Java 8+ 推荐) - 使用
Stream.sorted()(Java 8+ 函数式风格)
使用 Collections.sort() (针对基本数据类型和可比较对象)
这是最传统、最基础的方法,它要求 ArrayList 中的元素必须是 可比较的,或者你需要提供一个自定义的 比较器。

a) 对基本数据类型或实现了 Comparable 接口的对象进行排序
ArrayList 中的元素是基本数据类型的包装类(如 Integer, Double)或者实现了 Comparable 接口(如 String, Date),可以直接调用 Collections.sort()。
示例:对 Integer 列表进行升序排序
import java.util.ArrayList;
import java.util.Collections;
public class SortArrayListExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(1);
numbers.add(8);
numbers.add(3);
numbers.add(9);
System.out.println("排序前: " + numbers);
// 使用 Collections.sort() 进行升序排序
Collections.sort(numbers);
System.out.println("排序后 (升序): " + numbers);
}
}
输出:
排序前: [5, 1, 8, 3, 9]
排序后 (升序): [1, 3, 5, 8, 9]
b) 使用自定义比较器 进行降序或复杂排序
如果你想进行降序排序,或者根据对象的某个自定义属性进行排序,你需要使用 Comparator。

示例:对 Integer 列表进行降序排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class SortArrayListComparatorExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(1);
numbers.add(8);
numbers.add(3);
numbers.add(9);
System.out.println("排序前: " + numbers);
// 使用 Collections.sort() 和 Comparator 进行降序排序
// Comparator.reverseOrder() 是一个内置的比较器,用于实现自然顺序的逆序
Collections.sort(numbers, Comparator.reverseOrder());
System.out.println("排序后 (降序): " + numbers);
}
}
输出:
排序前: [5, 1, 8, 3, 9]
排序后 (降序): [9, 8, 5, 3, 1]
示例:对自定义对象列表进行排序
假设我们有一个 Student 类,我们想根据学生的年龄进行排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
// 1. 定义 Student 类
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
// 2. 主程序
public class SortCustomObjectExample {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三", 22));
students.add(new Student("李四", 20));
students.add(new Student("王五", 25));
students.add(new Student("赵六", 21));
System.out.println("排序前: " + students);
// 方式一:使用匿名内部类创建 Comparator (Java 8 之前)
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 按年龄升序排序
return Integer.compare(s1.getAge(), s2.getAge());
}
});
System.out.println("排序后 (按年龄升序): " + students);
}
}
输出:
排序前: [Student{name='张三', age=22}, Student{name='李四', age=20}, Student{name='王五', age=25}, Student{name='赵六', age=21}]
排序后 (按年龄升序): [Student{name='李四', age=20}, Student{name='赵六', age=21}, Student{name='张三', age=22}, Student{name='王五', age=25}]
使用 List.sort() (Java 8+ 推荐)
从 Java 8 开始,List 接口本身增加了 sort() 方法,这个方法的行为和 Collections.sort() 几乎完全一样,但它直接在 List 实例上调用,代码更简洁,更符合面向对象的思想。
语法: list.comparator
示例:
import java.util.ArrayList;
import java.util.Comparator;
public class ListSortExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(1);
numbers.add(8);
System.out.println("排序前: " + numbers);
// 使用 List.sort() 进行升序排序
// null 参数表示使用自然顺序
numbers.sort(null);
System.out.println("排序后 (升序): " + numbers);
// 使用 List.sort() 和 Comparator 进行降序排序
numbers.sort(Comparator.reverseOrder());
System.out.println("排序后 (降序): " + numbers);
}
}
对自定义对象排序 (使用 Lambda 表达式):
List.sort() 结合 Java 8 的 Lambda 表达式,让代码非常简洁优雅。
import java.util.ArrayList;
import java.util.Comparator;
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 LambdaSortExample {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三", 22));
students.add(new Student("李四", 20));
students.add(new Student("王五", 25));
System.out.println("排序前: " + students);
// 使用 List.sort() 和 Lambda 表达式按年龄升序排序
students.sort((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));
System.out.println("排序后 (按年龄升序): " + students);
// 使用方法引用 按年龄升序排序 (更简洁)
// students.sort(Comparator.comparingInt(Student::getAge));
// 按年龄降序排序
students.sort((s1, s2) -> Integer.compare(s2.getAge(), s1.getAge()));
// 或者
// students.sort(Comparator.comparingInt(Student::getAge).reversed());
System.out.println("排序后 (按年龄降序): " + students);
}
}
Lambda 表达式 (s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()) 等价于匿名内部类,但代码量大大减少。
使用 Stream.sorted() (Java 8+ 函数式风格)
如果你不打算原地修改 ArrayList,而是想创建一个新的已排序列表,Stream 是一个很好的选择。Stream.sorted() 方法返回一个新的 Stream,你需要将其收集回一个 List。
语法: list.stream().sorted(comparator).collect(Collectors.toList())
示例:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class StreamSortExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(1);
numbers.add(8);
System.out.println("原始列表: " + numbers);
// 使用 Stream.sorted() 创建一个新的升序列表
// 原始列表 numbers 保持不变
List<Integer> sortedNumbers = numbers.stream()
.sorted() // 自然排序
.collect(Collectors.toList());
System.out.println("新排序列表 (升序): " + sortedNumbers);
System.out.println("原始列表未改变: " + numbers);
// 使用 Stream.sorted() 和 Comparator 创建一个新的降序列表
List<Integer> reverseSortedNumbers = numbers.stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
System.out.println("新排序列表 (降序): " + reverseSortedNumbers);
}
}
对自定义对象排序:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
class Student { /* ... 与上面相同的 Student 类 ... */ }
public class StreamCustomObjectSortExample {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三", 22));
students.add(new Student("李四", 20));
students.add(new Student("王五", 25));
System.out.println("排序前: " + students);
// 使用 Stream.sorted() 和 Lambda 按年龄升序,创建新列表
List<Student> sortedByAge = students.stream()
.sorted(Comparator.comparingInt(Student::getAge))
.collect(Collectors.toList());
System.out.println("新列表 (按年龄升序): " + sortedByAge);
}
}
Comparator.comparingInt(Student::getAge) 是一个更强大的方法引用,专门用于根据 int 类型的属性进行比较,非常推荐使用。
总结与对比
| 方法 | 原地排序 | 适用场景 | 代码风格 | 备注 |
|---|---|---|---|---|
Collections.sort() |
是 | Java 8 之前的代码,或需要兼容旧版本。 | 传统 | 静态工具方法。 |
List.sort() |
是 | Java 8+ 推荐做法,原地排序时首选。 | 现代/面向对象 | 代码更简洁,直接在列表上调用。 |
Stream.sorted() |
否 | 当你需要保留原始列表,并创建一个新的排序列表时。 | 函数式/链式调用 | 功能强大,可以与其他 Stream 操作(如 filter, map)组合使用。 |
如何选择?
-
如果你使用 Java 8 或更高版本,并且需要原地修改列表:
- 首选
list.sort(null)进行自然排序。 - 首选
list.sort(Comparator.comparing(...))进行复杂排序,这是最现代、最清晰的方式。
- 首选
-
如果你需要保留原始列表,并创建一个新的排序列表:
- 使用
list.stream().sorted(...).collect(Collectors.toList()),这在函数式编程中非常常见。
- 使用
-
如果你在维护一个旧的 Java 项目(Java 7 或更早):
- 使用
Collections.sort(list)和Collections.sort(list, comparator)。
- 使用
希望这个详细的解释能帮助你掌握 Java 中 ArrayList 的排序!
