Comparator和Comparable的区别?
Comparator
和 Comparable
是 Java 中用于对象排序的两个接口,它们之间有一些关键的区别:
定义: Comparable
接口用于定义对象的自然排序。实现这个接口的类需要重写 compareTo(T o)
方法。
单一排序: 一个类只能实现一个 Comparable
接口,因此它只能有一种自然排序方式。
方法:
int compareTo(T o)
: 比较当前对象与指定对象的顺序。如果当前对象小于、等于或大于指定对象,则返回负整数、零或正整数。使用场景: 当你希望对象有一个默认的排序方式时,可以实现 Comparable
接口。
定义: Comparator
接口用于定义对象的自定义排序。实现这个接口的类需要重写 compare(T o1, T o2)
方法。
多种排序: 一个类可以有多个 Comparator
实现,因此可以定义多种排序方式。
方法:
int compare(T o1, T o2)
: 比较两个对象的顺序。如果第一个对象小于、等于或大于第二个对象,则返回负整数、零或正整数。使用场景: 当你需要对同一类对象进行多种不同的排序时,可以使用 Comparator
。
import java.util.*;
class Person implements Comparable<Person> {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return this.age - other.age; // 按年龄排序
}
}
class PersonNameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name); // 按名字排序
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
// 使用 Comparable 进行自然排序(按年龄)
Collections.sort(people);
for (Person p : people) {
System.out.println(p.name + " - " + p.age);
}
// 使用 Comparator 进行自定义排序(按名字)
Collections.sort(people, new PersonNameComparator());
for (Person p : people) {
System.out.println(p.name + " - " + p.age);
}
}
}
Comparable
时,类本身定义了自然排序。Comparator
时,可以在外部定义多种排序方式。