Java中Comparable接口与Comparator接口的区别
一、
Java的命名规则讲究“见名知意”,compare(比较、对比)这个词我们非常熟悉,那么也基本知道Comparable接口与Comparator接口是干嘛的啦,其作用就是比较,这样可以方便对数组、集合类进行排序。因为可以直接调用Arrays.sort(数组)方法或Collections.sort(集合类)方法,而且通过翻看源码,我们发现这两个方法的底层实现确实是基于Comparable接口与Comparator接口的。
不同点:
1.接口中规定的方法不同
Comparable接口中是:public int compareTo(T o);
Comparator接口中是:int compare(T o1,T o2);
2.作用不同
Comparable接口:使你设计的类具有“天生”的比较能力,只要你实现了这个接口,并覆写了唯一的compareTo()方法。
Comparator接口:一个类一旦实现了Comparable接口,并覆写了compareTo()方法,那么它的实现方式就固定下来了,如果你不喜欢,还想有其他不同的排序方式,可以创建一个实现了此接口的单独的类。
二、Comparable接口
1.非常值得一提的是八大基本类型对应的包装类和字符串类都实现了此接口并覆写了compareTo()方法,所以调用Arrays.sort(数组)方法后可以得知排序后的数组,如下图所示。
2.如果自定义一个类,并没有实现Comparable接口,直接调用Arrays.sort(数组)方法,会抛出类型转化异常java.lang.ClassCastException,如下图所示。
3.Stu类实现Comparable接口,并覆写compareTo()方法
class Stu implements Comparable<Stu> {
int id;
String name;
int age;
public Stu(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public int compareTo(Stu stu) {
return this.id - stu.id;
}
}
public class Test {
public static void main(String[] args) {
Stu[] arr = {
new Stu(143, "三儿",20),
new Stu(140, "四儿", 30), new Stu(141, "五儿", 19) };
Arrays.sort(arr);
for (Stu stu : arr) {
System.out.println(stu.id + " " + stu.name + " " + stu.age);
}
}
}
可以得到按学号排序的输出。
三、Comparator接口
也正因为Stu类实现Comparable接口,并覆写compareTo()方法,所以以后只要一调用Arrays.sort(数组)方法,只能得到按学号排序的输出。但现在我想得到按年龄大小排序的输出怎么办?????那我们可以借用Comparator接口重新定义一个排序规则。
class Stu implements Comparable<Stu>{
int id;
String name;
int age;
public Stu(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public int compareTo(Stu stu) {
return this.id - stu.id;
}
}
//不想使用Stu天生的排序方法,自定义一个排序规则
class MyComparator implements Comparator<Stu> {
@Override
public int compare(Stu s1, Stu s2) {
//按年龄大小排序
return s1.age - s2.age;
}
}
public class Test {
public static void main(String[] args) {
Stu[] arr = {
new Stu(143, "三儿", 17),
new Stu(140, "四儿", 20), new Stu(141, "五儿", 19) };
//按照自定义的排序规则排序
Arrays.sort(arr, new MyComparator());
for (Stu stu : arr) {
System.out.println(stu.id + " " + stu.name + " " + stu.age);
}
}
}
可以得到按年龄从小到大排序输出。
还没有评论,来说两句吧...