Java中ArrayList自定义排序核心是Comparator,推荐用Lambda或Comparator.comparing链式调用;可处理多字段、null值及自然排序(Comparable接口)。

在 Java 中,ArrayList 按自定义规则排序,核心是使用 Collections.sort() 或 list.sort() 配合自定义比较器(Comparator)。Java 8 起推荐用 Lambda 表达式或方法引用,简洁又直观。
用 Lambda 表达式写比较逻辑
适合简单、一次性的排序需求。假设有一个 Person 类,按年龄升序排列:
ArrayList<Person> list = new ArrayList<>(); // 添加数据... list.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
如果想降序,把参数顺序调换或加负号:
(p1, p2) -> Integer.compare(p2.getAge(), p1.getAge())- 或更简洁:
Comparator.comparingInt(Person::getAge).reversed()
用 Comparator.comparing 链式构造
适合多字段、可读性强的排序。例如先按城市升序,城市相同时按年龄降序:
立即学习“Java免费学习笔记(深入)”;
list.sort(Comparator.comparing(Person::getCity)
.thenComparing(Comparator.comparingInt(Person::getAge).reversed()));
注意:字段为 null 时会抛 NullPointerException,可用 Comparator.nullsFirst() 或 nullsLast() 处理。
实现 Comparable 接口(自然排序)
如果该类“默认就该这么排”,可在类内部实现 Comparable:
public class Person implements Comparable<Person> {
private String name;
private int age;
// 构造、getter 省略
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // 升序
}
}
之后直接调用 Collections.sort(list) 或 list.sort(null) 即可,无需额外传比较器。
对基本类型包装类或字符串做特殊处理
比如按字符串长度排序:
list.sort(Comparator.comparing(String::length));- 忽略大小写排序:
String.CASE_INSENSITIVE_ORDER或String::compareToIgnoreCase
数字列表倒序: list.sort(Collections.reverseOrder());


















