Comparable和Comparator接口的区别
(2011-04-03 15:51:21)原本打算写Comparable接口的实现问题的,看了之前汪志鹏同学关于Comparator接口的小结后,决定小改下内容。主要由于二者都是重写了老师上课提到的关于数组排序的Arrays.sort()方法的相应规则,又都是用来实现自定义对象数组的排序,我采用的是Comparable接口,所以拿来和汪同学的对比下,以显示二者之间的区别。
鉴于之前汪同学采用了DOG类,我下面写一个Comparable的接口实现类,同学们可以参照Comparator的先试着找找二者间的区别。
下面补充一些关于Comparable的相关知识:
1、Comparable接口需要重写一个方法,即public int compareTo(Object o){};
2、同Comparator一样,它们实际都是通过改写某种规则来实现对象之间的比较,如此题中自定义的DOG类,通过比较WEIGHT来实现其整个对象数组的排列,而调用的方法都是Arrays.sort(),但要注意二者使用该方法的参数并不相同,较之书本例子Comparable可能更形象一些。
3、对升序降序的改写分析:返回负值的排前,返回正值的排后,为了把this这个当前对象大时排前,小时插后(即实现降序),比较时显然该在this大时返回负值,this小时返回正值。
再接下来我用小结描述下二者的不同:
1、Comparator在集合(即你要实现比较的类)外进行定义的实现,而Comparable接口则是在你要比较的类内进行方法的实现。这样看来Comparator更像是一个专用的比较器。
3、Comparable支持自比较,自比较是指比如String等类里面本身就有CompareTo()方法,直接就可以进行String类对象的比较,这也可以从较之Comparator,Comparable中Arrays.sort()方法中只带数组参数的形式与书上例子更相似这点看出。
4、从第3点延伸,我们可以看到当不满足于自比较函数,如String类时,我们试图改写规则要怎么办——通过Comparator因为它支持外比较,它是分离的。
5、当一个又一个类设计完成后,或许我们最初没有设想到类的比较问题,而没使用Comparable接口,那我们之后可以通过Comparator来完成,而同时无需改变之前完成的类的构建。
6、运用Arrays.sort()方法时,注意二者的参数不同,Comparator多了一个参数,这第二个参数是使用Comparator接口的那个被视为专用比较器的类的对象,如汪同学例子中的new ByWeightComparator()。
其实大部分情况下我们并不需要刻意去对二者做选择,哪个用得顺手就用哪个,但当你的习惯遭遇某种问题时,这样的区别分析可以让你不妨换个方向思考,不至于走入死胡同。
以上分析多是个人理解,如有纰漏,还望加以修正。