黑马程序员技术交流社区

标题: comparable接口和comparator接口的区别 [打印本页]

作者: lyw@heima    时间: 2013-12-17 22:07
标题: comparable接口和comparator接口的区别
如何区别comparable接口和comparator接口
作者: yuehaotian    时间: 2013-12-17 22:13
comparable  是让元素自身具备比较性

comparator  是让一个类,描述所存元素的比较性 。俗称(比较器)
  
作者: ζ丶凡σ    时间: 2013-12-17 22:16
Comparable接口:
                1、lang包下的接口
                2、自定义类实现此接口并定义好自身具备比较性。
                3、需要覆盖的方法comparoTo();

Comparator接口:
                1、util包下的接口
                2、自定类不具备比较性时,单独定义一个比较器,实现此接口,交就此类对象传入TreeSet集合中作业构造参数。
                3、需要覆盖的方法compare(); (本接口还有equals()方法,不必覆盖,因为自定义类已经继承了Object中的equals方法。)
作者: belief丶Only    时间: 2013-12-19 16:43
1、Comparator在集合(即你要实现比较的类)外进行定义的实现,而Comparable接口则是在你要比较的类内进行方法的实现。这样看来Comparator更像是一个专用的比较器。

2、Comparator实现了算法和数据的分离,从代码也可以看出,其实这和第一点是相辅相成的,因为Comparable依赖于某一个需要比较的类来实现。

3、Comparable支持自比较,自比较是指比如String等类里面本身就有CompareTo()方法,直接就可以进行String类对象的比较,这也可以从较之Comparator,Comparable中Arrays.sort()方法中只带数组参数的形式与书上例子更相似这点看出。

4、从第3点延伸,我们可以看到当不满足于自比较函数,如String类时,我们试图改写规则要怎么办——通过Comparator因为它支持外比较,它是分离的。

5、当一个又一个类设计完成后,或许我们最初没有设想到类的比较问题,而没使用Comparable接口,那我们之后可以通过Comparator来完成,而同时无需改变之前完成的类的构建。

6、运用Arrays.sort()方法时,注意二者的参数不同,Comparator多了一个参数,这第二个参数是使用Comparator接口的那个被视为专用比较器的类的对象,如汪同学例子中的new ByWeightComparator()。





其实大部分情况下我们并不需要刻意去对二者做选择,哪个用得顺手就用哪个,但当你的习惯遭遇某种问题时,这样的区别分析可以让你不妨换个方向思考,不至于走入死胡同。

以上分析多是个人理解,如有纰漏,还望加以修正。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2