Comparator接口
public interface Comparator<T>
在对数组以及集合的排序中,我们经常使用Arrays.sort(A);或者Collections.sort(A)对数组或集合进行排序。当我们需要自定义排序规则的时候,就要使用Comparable或者Comparator接口。Comparable是和具体的类进行绑定,也就是“静态绑定”。而Comparator是在具体的类中可以选择不同的Comparator进行绑定,也就是“动态绑定”(策略模式)。关于两者的使用都比较简单,主要是重写compare()方法。这里只分析Comparator在排序中的应用。
在使用Comparator时,首先是重写其中的compare()方法
Comparator compare = new Comparator<Point2>(){
//c.compare(points[i-1],points[i])
@Override
public int compare(Point2 o1, Point2 o2) {
if(o1.value > o2.value) {
return 1;
}else{
return -1;
}
}};
Comparable和Comparator区别比较
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
3.1 Comparable
1. 类的继承关系
public interface Comparable<T>
说明:Comparable就是一个泛型接口,很简单。
2. compareTo方法
public int compareTo(T o);
说明:compareTo方法就构成了整个Comparable源码的唯一的有效方法。
3.2 Comparator
1. 类的继承关系
public interface Comparator<T>
说明:同样,Comparator也是一个泛型接口,很简单。
2. compare方法
int compare(T o1, T o2);
说明:Comparator接口中一个核心的方法。
3. equals方法
boolean equals(Object obj);
说明:此方法是也是一个比较重要的方法,但是一般不会使用,可以直接使用Object对象的equals方法(所有对象都继承自Object)。
其他在JDK1.8后添加的方法对我们的分析不产生影响,有感兴趣的读者可以自行阅读源码,了解更多细节。