java中arraylist自定义排序有三种方式:一、对象实现comparable接口,重写compareto()方法定义自然顺序;二、使用comparator(lambda或方法引用)灵活指定排序规则;三、stream.sorted()生成新有序列表。

Java 中 ArrayList 实现自定义对象排序,核心是让对象可比较(实现 Comparable)或提供外部比较规则(传入 Comparator),再调用 Collections.sort() 或 list.sort()。
方式一:让对象自身实现 Comparable 接口
适用于该类有“天然”的、唯一的排序逻辑(比如按 ID 升序、按姓名字典序)。需重写 compareTo() 方法:
public class Person implements Comparable<person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
// 先按年龄升序,年龄相同时按姓名升序
int ageDiff = Integer.compare(this.age, other.age);
if (ageDiff != 0) return ageDiff;
return this.name.compareTo(other.name);
}
}
</person>
排序时直接调用:
Collections.sort(personList);- 或
personList.sort(null);(null表示使用元素自身的自然顺序)
方式二:使用 Comparator 匿名内部类或 Lambda 表达式(推荐)
更灵活,适合临时排序、多条件切换或无法修改原类的情况。例如按年龄降序:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 传统匿名类:
Collections.sort(personList, new Comparator<person>() { ... });</person> - Lambda 更简洁:
personList.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge())); - 方法引用(JDK 8+):
personList.sort(Comparator.comparingInt(Person::getAge).reversed());
支持链式组合,比如“先按年龄降序,再按姓名升序”:
personList.sort(
Comparator.comparingInt(Person::getAge).reversed()
.thenComparing(Person::getName)
);
方式三:使用 Stream.sorted()(不修改原列表)
如果不想改变原始 ArrayList,可用 Stream 创建新有序集合:
List<person> sorted = personList.stream()</person>.sorted(Comparator.comparing(Person::getName)).collect(Collectors.toList());
注意:返回的是新 List,原 list 不变;若需转回 ArrayList,可用 new ArrayList(sorted)。
注意事项
- 确保字段非 null,否则
compareTo()或Comparator可能抛NullPointerException;可用Comparator.nullsFirst()或Objects.compare()处理 - 若对象字段在排序后可能被修改,且 list 被反复排序,需注意逻辑一致性
- ArrayList 本身不自动排序,每次排序都是显式调用,时间复杂度为 O(n log n)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










