Comparable和Comparator
文章目录
两者各自的定义和区别
首先 Comparable是一个排序结口。需要实现了其中的compareTo(T o)方法(按照顺序排序)
Comparator结口实现的是compare(T o1,T o2)方法。
Comparable
Comparable可以认为是一个内部比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现(返回值为int),compareTo方法也被称为自然比较方法。
Comparable支持排序:实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
Comparable定义:
Comparable接口仅仅包括一个函数,它的定义如下:
public interface Comparable{
public int compareTo(T o);
}
关于返回值
可以看出CompareTo方法返回一个int值,该值有三种返回值:
1.返回负数:表示当前对象小于比较对象,
2.返回0:表示当前对象等于目标对象,
3.返回正数:表示当前对象大于目标对象。
Comparator
Comparator可以认为是是一个外比较器。Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int
Comparator定义:
Comparator接口仅仅只包括两个函数,它的定义如下:
public interface Comparator{
int compare(T o1,T o2);
boolean equals(Object obj);
}
int compare(T o1,T o2);是比较o1和o2的大小。返回负数,意味着o1比o2小;返回0,意味着o1等于o2;返回正数,意味着意味着o1比o2。
总结 Comparator比Comparable更具优势
总结一下,两种比较器Comparable和Comparator,后者相比前者有如下优点:
1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法:Comparator更适合自定义的比较,可以直接有一个MyComparator实现Comparator,Person类再实现MyComparator;Comparable就比较固定,想要实现自定义就要 修改源码。
2、实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修 改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator 接口的方式后面会写到就是一种典型的策略模式。