转自:https://www.cnblogs.com/xujian2014/p/5215082.html
一.Comparable简介
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
该接口定义如下:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
T表示可以与此对象进行比较的那些对象的类型。
此接口只有一个方法compareTo,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
现在我们假设一个Person类,代码如下:
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.age-o.age;//排序指标是age
}
public static void main(String[] args){
Person[] people=new Person[]{new Person("Mary", 25),new Person("Tony", 22)};
System.out.println("Before Sorting:");
for (Person person : people){
System.out.println(person.getName()+"-"+person.getAge());
}
Arrays.sort(people);
System.out.println("After Sorting:");
for (Person person : people){
System.out.println(person.getName()+"-"+person.getAge());
}
}
}
输出:
Before Sorting:
Mary-25
Tony-22
After Sorting:
Tony-22
Mary-25
二.Comparator简介
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。该接口定义如下:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
注意:
1.若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
2.int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
现在假如上面的Person类没有实现Comparable接口,该如何比较大小呢?我们可以新建一个类,让其实现Comparator接口,从而构造一个“比较器"。
public class PersonCompartor implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
}
现在我们就可以利用这个比较器来对其进行排序:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args){
Person[] people=new Person[]{new Person("Mary", 25),new Person("Tony", 22)};
System.out.println("Before Sorting:");
for (Person person : people){
System.out.println(person.getName()+"-"+person.getAge());
}
Arrays.sort(people,new PersonCompartor());
System.out.println("After Sorting:");
for (Person person : people){
System.out.println(person.getName()+"-"+person.getAge());
}
}
}
能得到和之前同样的输出。
三.Comparable和Comparator区别比较
Comparable和Comparator接口均可以用来对某个对象数组或集合按照某个指标进行排序,但是它俩有一些不同。
Comparable是排序接口,涉及一个对象类、比较器类,比较方法为compareTo(Object o),排序方法为一个参数的Collections.sort()或Arrays.sor()方法,使用简单但需修改对象类源码;而Comparator是比较接口,涉及两个类包括对象类、比较器类,比较方法为compare(Object o1,Object o2),排序方法为两个参数的Collections.sort()或Arrays.sor()方法,无需修改源码。
值得一提的是像byte,short,int,long,double,float,char等基本数据类型都实现了Comparable接口.