文章目录
- 一.Comparable
- 二. Comparator
- 三.对比
- 1. Comparable 接口
- 2. Comparator 接口
- 总结
一.Comparable
-
源码:
public interface Comparable<T> {int compareTo(T o); }
-
返回值:
- 如果当前对象小于参数对象,则返回负整数。
- 如果当前对象等于参数对象,则返回零。
- 如果当前对象大于参数对象,则返回正整数。
-
使用场景:
Comparable
通常用于自然排序,例如,整数从小到大排序,字符串按字典顺序排序等。 -
example:
假设有一个Person
类,我们希望按照年龄排序:public class Person implements Comparable<Person> {private int age;public Person(int age) {this.age = age;}@Overridepublic int compareTo(Person other) {return this.age - other.age;} }
二. Comparator
-
源码:
public interface Comparator<T> {int compare(T o1, T o2); }
-
返回值:
- 如果
o1
小于o2
,则返回负整数。 - 如果
o1
等于o2
,则返回零。 - 如果
o1
大于o2
,则返回正整数。
- 如果
-
使用场景:
Comparator
用于自定义排序。当我们需要对同一类型的对象按不同的标准进行排序时,Comparator
非常有用。 -
示例:
对于上述的Person
类,如果我们想按照姓名的字母顺序进行排序,我们可以这样做:public class NameComparator implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {return p1.getName().compareTo(p2.getName());} }
三.对比
1. Comparable 接口
- 内部比较法:
Comparable
接口通常被实现在需要比较的对象的类定义中,它定义了对象的自然排序方法。如果一个类实现了Comparable
接口,它必须定义compareTo
方法,这个方法将用于所有基于该类对象的自然排序。 - 单一条件排序:当类实现了
Comparable
,它的compareTo
方法通常只基于一个单一的比较标准来排序。 - 简单直接:实现
Comparable
接口的排序通常是对象的默认排序方式,直接通过Collections.sort()
或Arrays.sort()
对实现了Comparable
的对象列表进行排序,无需指定额外的比较器。
2. Comparator 接口
- 外部比较法:
Comparator
接口通常作为一个独立的类来实现,它定义了两个对象之间的比较方法。这允许开发者在不改变对象类的情况下,创建多种不同的比较方法。 - 多条件排序:可以创建多个不同的
Comparator
实现类,每个实现类可以根据不同的属性或条件来比较同一类型的对象。 - 更灵活:
Comparator
在调用排序方法如Collections.sort()
或Arrays.sort()
时需要显式指定。这使得在同一程序中可以有多种排序方式,特别是在比较标准经常变化或有多重排序标准的情况下。
总结
- 用途:如果对象有一个自然的排序顺序(如数字、字母顺序等),通常使用
Comparable
。如果需要多种排序方式或者排序对象时不想修改对象的类,使用Comparator
。 - 实现方式:
Comparable
嵌入到类中,Comparator
作为独立的实现。 - 灵活性:
Comparator
比Comparable
更灵活,提供了更多的控制权和定制排序选项。