Comparable和Comparator的区别与使用
2025-04-20 00:20:51 16
Comparable和Comparator的使用方法与示例
一、Comparable的使用
核心逻辑:让对象自身实现比较能力,定义默认的自然排序规则。
使用步骤:
- 实现接口:目标类实现
Comparable<T>
接口。 - 重写方法:重写
compareTo(T o)
方法,定义比较规则。 - 调用排序:直接使用
Collections.sort(list)
或Arrays.sort(array)
排序。
示例(按年龄升序排序):
public class Person implements Comparable<Person> {
private String name;
private int age;
@Override
public int compareTo(Person o) {
return Integer.compare(this.age, o.age); // 按年龄升序
}
}
// 调用排序
List<Person> people = new ArrayList<>();
Collections.sort(people); // 直接排序,无需额外参数
二、Comparator的使用
核心逻辑:通过外部比较器灵活定义多种排序规则,无需修改原类。
使用方式:
1. 独立比较器类
• 定义比较器:创建类实现Comparator<T>
接口,重写compare(T o1, T o2)
方法。
• 调用排序:传入比较器实例作为参数。
示例(按姓名升序排序):
public class NameComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
// 调用排序
Collections.sort(people, new NameComparator());
2. 匿名内部类/Lambda表达式
• 即时定义规则:适用于临时或单次使用的排序需求。
示例(按年龄降序):
// 匿名内部类
Collections.sort(people, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o2.getAge() - o1.getAge(); // 年龄降序
}
});
// Lambda表达式(Java 8+)
Collections.sort(people, (p1, p2) -> p2.getAge() - p1.getAge());
3. 链式多级排序
• 组合多个条件:例如先按年龄排序,年龄相同再按姓名排序。
示例(多级排序):
Comparator<Person> multiComparator = Comparator
.comparingInt(Person::getAge) // 第一级:年龄升序
.thenComparing(Person::getName); // 第二级:姓名升序
Collections.sort(people, multiComparator);
三、对比与适用场景
特性 | Comparable | Comparator |
---|---|---|
修改源码 | 需要(类需实现接口) | 不需要(外部定义) |
排序规则 | 单一默认规则(自然排序) | 支持多种规则(如按年龄、姓名、成绩等) |
灵活性 | 低 | 高(可动态扩展) |
典型场景 | 类需默认排序(如String 、Integer ) | 需动态排序或无法修改原类时 |
总结
• 使用Comparable:当类需要默认排序规则且允许修改源码时(如自然顺序)。
• 使用Comparator:当需要灵活定义多种排序规则,或无法修改原类时(如第三方库中的类)。
• Java 8优化:通过Comparator.comparing()
和Lambda表达式可大幅简化代码。