Java中ArrayList按对象属性排序需用Comparator配合sort方法:可使用comparingInt/comparing链式调用实现多级排序,支持reversed()降序;复杂逻辑可用匿名类或nullsFirst等工具;实体类实现Comparable适用于固定自然序;注意原地修改、null安全及stream.sorted返回新列表。

Java 中 ArrayList 按照对象属性排序,核心是使用 Collections.sort() 或 list.sort() 配合比较器(Comparator),而不是直接对原始类型排序。
用 Comparator 按单个属性排序
假设有一个 Student 类,含 name 和 age 属性,想按 age 升序排列:
ArrayList<Student> list = new ArrayList<>(); // 添加数据... list.sort(Comparator.comparingInt(s -> s.age));
这是最常用的方式。comparingInt 会自动处理 int 类型,避免装箱;若属性是 String,可用 comparing(s -> s.name);支持链式调用,比如先按 age 再按 name:
list.sort(Comparator.comparingInt(s -> s.age).thenComparing(s -> s.name));- 升序是默认行为,降序加
.reversed(),如comparingInt(...).reversed()
自定义 Comparator 实现复杂逻辑
当排序规则不能用 lambda 简洁表达时(比如 null 安全、多条件嵌套、业务规则),可写匿名类或独立类:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
list.sort(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if (s1.name == null && s2.name == null) return 0;
if (s1.name == null) return -1;
if (s2.name == null) return 1;
return s1.name.compareTo(s2.name);
}
});
Java 8 后更推荐用静态方法引用或 null-safe 工具方法:
-
Comparator.nullsFirst(Comparator.naturalOrder())处理可能为 null 的字符串 Comparator.comparing(Student::getName, Comparator.nullsFirst(String::compareTo))
让实体类自身支持排序(实现 Comparable)
如果 Student 的“自然顺序”就是按 age 排,可让类实现 Comparable:
class Student implements Comparable<Student> {
String name;
int age;
@Override
public int compareTo(Student other) {
return Integer.compare(this.age, other.age);
}
}
之后直接调用 Collections.sort(list) 或 list.sort(null) 即可。注意:只适用于一种固定主排序逻辑,灵活性不如外部 Comparator。
注意点和常见坑
排序操作会直接修改原 ArrayList,不生成新列表;若需保留原顺序,先 new ArrayList(originalList) 复制一份。
- 基本类型包装类(如 Integer、String)本身已实现 Comparable,可直接排序;自定义对象必须提供比较逻辑
- 使用 stream.sorted() 会返回新 List,原 list 不变:
List<Student> sorted = list.stream().sorted(Comparator.comparing(...)).collect(Collectors.toList()); - 避免在比较器中修改对象状态,否则可能引发不可预测行为

















