使用排序的比较器 comparable{compareTo(Object o)} comparator{compare(o1,o2)} 区别
时间: 2023-11-01 14:15:21 浏览: 78
好问题!虽然 `Comparable` 和 `Comparator` 都可以用来比较对象,但它们有一些区别。
`Comparable` 是一个接口,它定义了一个 `compareTo()` 方法,用于比较对象的自然顺序。自然顺序是指对象本身就有的顺序,比如数字的大小、字母的顺序等。如果一个类实现了 `Comparable` 接口,那么它的对象就可以使用 `Arrays.sort()` 或 `Collections.sort()` 方法进行排序了。这个方法只能由类本身去实现,因此它只能定义一种排序方式。
举一个例子,假设我们有一个 `Person` 类,它实现了 `Comparable` 接口,按照年龄从小到大排序:
```java
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;
}
// 实现 compareTo 方法
@Override
public int compareTo(Person o) {
return this.age - o.getAge();
}
}
```
然后我们可以使用 `Collections.sort()` 方法对 `Person` 对象进行排序:
```java
List<Person> persons = new ArrayList<>();
persons.add(new Person("Tom", 20));
persons.add(new Person("Jerry", 18));
persons.add(new Person("Alice", 22));
Collections.sort(persons);
```
这样就按照年龄从小到大排序了。
相比之下,`Comparator` 是一个接口,它定义了一个 `compare()` 方法,用于比较对象的次序。次序可以是任意的,不一定是对象的自然顺序。如果一个类需要多种排序方式,可以实现多个 `Comparator` 接口。这个方法可以由类外部去实现,因此它可以定义多种排序方式。
假设我们有一个 `Person` 类,我们可以按照姓名字母顺序排序:
```java
public class NameComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
```
然后我们可以使用 `Collections.sort()` 方法并传入 `NameComparator` 对象对 `Person` 对象进行排序:
```java
List<Person> persons = new ArrayList<>();
persons.add(new Person("Tom", 20));
persons.add(new Person("Jerry", 18));
persons.add(new Person("Alice", 22));
Collections.sort(persons, new NameComparator());
```
这样就按照姓名字母顺序排序了。
综上所述,`Comparable` 是用来定义对象的自然排序顺序,只能由类本身去实现;`Comparator` 是用来定义对象的次序,可以由类外部去实现,可以定义多种排序方式。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)