Comparable 和 Comparator
字数: 0 字 时长: 0 分钟
Comparable 和 Comparator 是 Java 中用于比较对象的两个接口。
从名字上也能看出来,它们的作用比较相似:
按照一定的规则比较两个对象。
1. Comparable
Comparable 接口的定义非常简单:
java
public interface Comparable<T> {
int compareTo(T o);
}如果一个类实现了 Comparable 接口,就可以通过重写:
java
compareTo()定义该类对象之间的比较规则。
例如:
java
public class Kerwim
implements Comparable<Kerwim> {
private int age;
private String name;
public Kerwim(
int age,
String name) {
this.age =
age;
this.name =
name;
}
@Override
public int compareTo(
Kerwim o) {
return this.getAge()
- o.getAge();
}
public static void main(
String[] args) {
Kerwim kerwim1 =
new Kerwim(
19,
"kerwim"
);
Kerwim kerwim2 =
new Kerwim(
16,
"克尔温"
);
if (
kerwim1.compareTo(
kerwim2
) < 0
) {
System.out.println(
kerwim1.getName()
+ "比较年轻有为"
);
} else {
System.out.println(
kerwim2.getName()
+ "比较年轻有为"
);
}
}
}在上面的示例中,创建了一个 Kerwim 类,它有两个字段:
text
age
nameKerwim 实现了:
java
Comparable<Kerwim>并重写:
java
compareTo()程序输出:
text
克尔温比较年轻有为因为:
text
16 < 19真正决定比较规则的就是:
java
compareTo()它的返回值可能为:
text
负数
0
正数分别表示:
text
当前对象 < 被比较对象
↓
返回负数
当前对象 == 被比较对象
↓
返回 0
当前对象 > 被比较对象
↓
返回正数也就是:
text
compareTo() < 0
↓
当前对象更小
compareTo() == 0
↓
两个对象在当前排序规则下相等
compareTo() > 0
↓
当前对象更大如果两个对象本身不能按照当前规则进行比较,就可能出现:
text
ClassCastException不过有了泛型以后,这类类型不匹配的问题通常可以更早在编译阶段发现。
2. Comparator
Comparator 和 Comparable 的作用相似,不过定义和使用方式有所不同。
核心定义:
java
public interface Comparator<T> {
int compare(
T o1,
T o2
);
boolean equals(
Object obj
);
}其中最核心的方法是:
java
compare(
T o1,
T o2
)返回值同样可能是:
text
负数
0
正数分别表示:
text
o1 < o2
↓
返回负数
o1 == o2
↓
返回 0
o1 > o2
↓
返回正数也就是:
text
compare(o1, o2) < 0
↓
o1 更小
compare(o1, o2) == 0
↓
两者在当前比较规则下相等
compare(o1, o2) > 0
↓
o1 更大Comparator 中还声明了:
java
equals(
Object obj
)用于判断两个 Comparator 在比较规则上是否相等。
不过实际使用 Comparator 时,我们最主要关注的还是:
java
compare()有时候,我们并不想修改原来的类,也不想让这个类主动实现:
java
Comparable但又需要对这些对象进行比较。
这时候:
text
Comparator就派上用场了。