相同点:
两者都是Java的接口,对Java自定义类进行比较大小(在集合或数组中)。
不同:
有自定义类Person
public class Person{
String name;
int age;
}
1.Comparable 定义在 Person类的内部,即Person实现Comparable接口:
若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
Comparable接口的定义:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。
实例:
public class Person implements Comparable {
String name;
int age;
public int compareTo(Person another) {//重写 compareTo()方法以实现比较
int i = 0;
i = name.compareTo(another.name);
if(i == 0) {
return age - another.age;
} else {
return i;
}
}
}
2.Comparator定义在Person类的外部,此时我们的Person类的结构不需要有任何变化:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);//子类必须实现该方法
boolean equals(Object obj);//不是必须要实现的,因为Object类已经实现了
}
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
实例:
public class Person{
String name;
int age;
}
class PersonComparator implements Comparator {
public int compare(Person one, Person another) {//实现Comparator需要覆盖 compare() 方法
int i = 0;
i = one.name.compareTo(another.name);
if(i == 0) {
return one.age - another.age;
} else {
return i;
}
}
}
在PersonComparator里面实现了怎么比较两个Person的大小. 所以,用这种方法,当我们要对一个 personList进行排序的时候, 我们除了了要传递personList过去, 还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator
里面实现的, 如:
Collections.sort( personList , new PersonComparator() ).
总结:
1.两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。
2.用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。