java 中给 arraylist 排序,最直接的办法是调用 collections.sort() 或列表自带的 list.sort()。这两个方法底层都依赖 timsort 算法,默认按自然顺序排列,若需自定义规则则传入 comparator。执行后原列表会被原地修改,返回值为空。

Collections.sort() 和 list.sort() 有什么区别
两者在功能上完全等价,主要区别在于 API 归属和历史背景。Collections.sort() 是静态工具方法,接受任意 List 实例;而 list.sort() 是 Java 8 引入的默认接口方法,直接作用于列表对象并返回自身。对于 ArrayList 这种支持随机访问的结构,两者性能一致。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Apple");
list.add("Cherry");
// 使用 Collections.sort
Collections.sort(list);
System.out.println("After Collections.sort: " + list);
// 重置列表
list.set(0, "Banana");
list.set(1, "Apple");
list.set(2, "Cherry");
// 使用 list.sort 并传入 Comparator
list.sort(Comparator.naturalOrder());
System.out.println("After list.sort: " + list);
}
}
运行上述代码,控制台将依次输出:
After Collections.sort: [Apple, Banana, Cherry]
After list.sort: [Apple, Banana, Cherry]
立即学习“Java免费学习笔记(深入)”;
如何对 ArrayList 进行降序或自定义排序
要实现非自然顺序(如降序)或针对对象属性的排序,必须提供 Comparator。可以通过 Comparator.reverseOrder() 实现简单降序,或通过 Comparator.comparing() 指定字段比较逻辑。这些比较器可以链式组合,例如先按姓名升序再按年龄降序。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CustomSortDemo {
static class Person {
String name;
int age;
Person(String name, int age) { this.name = name; this.age = age; }
@Override public String toString() { return name + "(" + age + ")"; }
}
public static void main(String[] args) {
List<Person> people = new ArrayList<>(Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30)
));
// 按年龄降序,年龄相同按姓名升序
Collections.sort(people, Comparator
.comparingInt((Person p) -> p.age)
.reversed()
.thenComparing(p -> p.name));
System.out.println("Sorted: " + people);
}
}
运行结果:
Sorted: [Charlie(30), Alice(30), Bob(25)]
如果 ArrayList 包含 null 值会怎样
当 ArrayList 中包含 null 元素时,默认排序会抛出 NullPointerException。这是因为自然排序和大多数 Comparator 无法处理 null 值的比较。若要安全排序,需使用 Comparator.nullsLast() 或 Comparator.nullsFirst() 包装原有比较器,将 null 值统一置于末尾或开头。


















