java中arraylist按对象属性排序主要通过comparator接口实现,推荐使用lambda表达式配合list.sort()(如comparator.comparingint(person::getage)),也支持匿名内部类、自定义comparator类及null安全的多级排序。

Java 中 ArrayList 按指定条件对对象属性排序,主要靠 Comparator 接口实现,配合 Collections.sort() 或 list.sort() 方法。核心是告诉程序“怎么比”,而不是“比什么”——重点在定义比较逻辑。
用 Lambda 表达式 + list.sort()(推荐,简洁)
适用于 Java 8+,代码最简,可读性强。假设有一个 Person 类,按年龄升序排列:
List<person> people = new ArrayList();
people.add(new Person("张三", 25));
people.add(new Person("李四", 22));
people.add(new Person("王五", 30));
// 按 age 升序
people.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
// 或更简洁写法(自动装箱/拆箱支持)
people.sort(Comparator.comparingInt(Person::getAge));
// 按 name 字典序降序
people.sort(Comparator.comparing(Person::getName).reversed());
</person>
用匿名内部类实现 Comparator(兼容老版本)
适合 Java 7 及以下,或逻辑较复杂需多行判断时:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
Collections.sort(people, new Comparator<person>() {
@Override
public int compare(Person p1, Person p2) {
// 先按年龄升序,年龄相同时按姓名降序
int ageDiff = Integer.compare(p1.getAge(), p2.getAge());
if (ageDiff != 0) return ageDiff;
return p2.getName().compareTo(p1.getName()); // 降序:反向调用
}
});
</person>
复用自定义 Comparator 类(适合多处使用同一规则)
把排序逻辑封装成独立类,便于测试、复用和维护:
public class PersonAgeNameComparator implements Comparator<person> {
@Override
public int compare(Person p1, Person p2) {
int ageCmp = Integer.compare(p1.getAge(), p2.getAge());
return ageCmp != 0 ? ageCmp : p1.getName().compareTo(p2.getName());
}
}
// 使用
Collections.sort(people, new PersonAgeNameComparator());
</person>
处理 null 值和复杂条件(安全排序)
实际开发中属性可能为 null,直接调用 getXXX() 会抛 NullPointerException。可用 Comparator.nullsFirst() 或 nullsLast() 控制 null 的位置:
-
Comparator.comparing(Person::getNickName, Comparator.nullsLast(String::compareTo)):null 排最后 -
Comparator.comparing(Person::getAge, Comparator.nullsFirst(Comparator.naturalOrder())):null 排最前 - 多级排序组合:
Comparator.comparing(Person::getAge).thenComparing(Person::getName)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










