比较Comparator与Comparable接口

简单比较下ComparatorComparable接口

ComparatorComparable 都是 Java 中用于比较对象大小的接口,但它们有以下区别:

  • 接口位置不同:Comparable 接口位于 java.lang 包中,而 Comparator 接口位于 java.util 包中。

  • 实现方式不同:实现 Comparable 接口的类需要重写 compareTo() 方法,而实现 Comparator 接口的类需要重写 compare() 方法。

  • 使用场景不同:实现 Comparable 接口的类通常用于已经有一定顺序的情况下,例如对整数或字符串进行排序。而实现 Comparator 接口的类通常用于需要动态指定排序方式的情况下,例如对自定义对象进行排序。

  • 排序方式不同:Comparable 接口是内部比较器,它定义了对象的自然顺序,即对象本身就有了固定的比较规则。而 Comparator 接口是外部比较器,它允许用户根据需要指定不同的比较规则。

综上所述,Comparable 接口适用于已经有一定顺序的情况下,而 Comparator 接口适用于需要动态指定排序方式的情况下。

以下是 Comparable 和 Comparator 的用法实例:

Comparable 实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Person implements Comparable<Person> {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}
}

在这个例子中,我们定义了一个 Person 类,并实现了 Comparable 接口。在 compareTo() 方法中,我们使用 Integer.compare() 方法比较了两个 Person 对象的年龄大小关系,从而定义了 Person 对象的自然顺序。这样,我们就可以在使用 Collections.sort()Arrays.sort() 方法时,直接对 `Person 对象进行排序。

Comparator 实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}
}

public class PersonCompartor implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
}

public class Test
{
public static void main(String[] args)
{
Person[] people=new Person[]{new Person("Tony", 20),new Person("Xiangqi", 10)};
System.out.println("排序前");
for (Person person : people)
{
System.out.print(person.getName()+":"+person.getAge());
}
Arrays.sort(people,new PersonCompartor());
System.out.println("\n排序后");
for (Person person : people)
{
System.out.print(person.getName()+":"+person.getAge());
}
}
}

在这个例子中,我们同样定义了一个 Person 类,但没有实现 Comparable 接口。然后,我们创建了一个 PersonComparator 类,实现了 Comparator 接口,并重写了 compare() 方法。在 compare() 方法中,我们比较了两个 Person 对象的年龄大小关系,从而定义了 Person 对象的比较规则。这样,我们就可以在使用 Collections.sort()Arrays.sort() 方法时,使用 PersonComparator 对象进行排序。

参考文献:

Java中Comparable和Comparator区别小结