Comparable和Comparator都是一个比较器接口,都能用于比较两个对象。根据接口的名称可知,实现Comparable的类将具备比较的能力;实现Comparator的类本身就是一个比较器。
1.比较器抽象方法
public interface Comparable<T> {
public int compareTo(T o);
}
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
从两者需要实现的抽象方法可知,Comparable子类是将自身与对象进行比较;而Comparator的子类可以比较其他两个对象。
2.具体应用
public class City{
private String name;
private int people;
}
对于一个普通的类City,它没有实现Comparable接口,也没有实现Comparator接口。但是,有一个需求就是对List<City>按City的name属性进行排序,这时应该怎么做?方案有两种:
方案一:改写City类,让其实现Comparable接口。代码如下:
public class City implements Comparable<City> {
private String name;
private int people;
@Override
public int compareTo(City o) {
int result = this.getName().compareTo(o.getName());
return result;
}
//equals()和hashCode()方法
}
List<City> cities = Lists.newArrayList(c1, c2, c3....)//c1等是City的实例
Collections.sort(cities);//按City的name属性进行排序
方案二:不改变原有的City,在Collections.sort()方法中传入一个Comparator比较器对象就行。代码如下:
Collections.sort(cities, new Comparator<City>() {
@Override
public int compare(City o1, City o2) {
int result = o1.getName().compareTo(o2.getName());
return result;
}
});
相对于方案一需要改变原有的City类而言,方案二的耦合度更低,对原有代码的侵入性更小。如果某个类是final修饰的,要对其进行排序,就只能使用方案二了。
综合上面两种方案,Comparator和Comparable实现的效果是基本一致的,Comparator相对Comparable而言对代码的侵入性要小。