介绍
Comparator
接口和 Comparable
接口都是用于实现对象比较的接口,但它们有不同的应用场景和使用方式。
comparable
- 位置: 实现
Comparable
接口的类在类的定义中直接实现了这个接口。 - 目的: 用于提供对象之间的自然顺序,也就是默认的排序规则。
- 方法: 实现了
Comparable
接口的类必须实现compareTo
方法,该方法返回一个负数、零或正数,分别表示当前对象小于、等于或大于传入的对象。 - 使用场景: 适用于那些在对象之间存在明显的自然顺序关系的情况,例如数字、字母等。
搭配compareTo,对原来的类进行操作,参数只有一个。
comparator
- 位置: 实现
Comparator
接口的类通常独立于要比较的类,并在需要比较时作为独立的比较器类传递。 - 目的: 提供一种灵活的比较机制,允许在不修改类本身的情况下定义多个不同的比较规则。
- 方法: 实现
Comparator
接口的类必须实现compare
方法,该方法也返回一个负数、零或正数,用于表示两个对象的比较结果。 - 使用场景: 适用于需要多种不同的排序规则,或者对于无法修改源代码的类进行比较的情况。
搭配compare,新建一个类进行操作,参数有两个
示例代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
// 实现 Comparable 接口的类
class Person implements Comparable<Person> {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}
@Override
public String toString() {
return name + " - " + age;
}
}
// 实现 Comparator 接口的类
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name);
}
}
public class ComparisonExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
people.add(new Person("Charlie", 30));
// 使用 Comparable 接口进行排序
Collections.sort(people);
System.out.println("按年龄从小到大排序:" + people);
// 使用 Comparator 接口进行排序
Collections.sort(people, new PersonComparator());
System.out.println("按姓名字典序排序:" + people);
}
}
(by 归忆)