A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

lyw@heima

中级黑马

  • 黑马币:0

  • 帖子:38

  • 精华:0

© lyw@heima 中级黑马   /  2013-12-17 22:07  /  1054 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何区别comparable接口和comparator接口

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
comparable  是让元素自身具备比较性

comparator  是让一个类,描述所存元素的比较性 。俗称(比较器)
  
回复 使用道具 举报
Comparable接口:
                1、lang包下的接口
                2、自定义类实现此接口并定义好自身具备比较性。
                3、需要覆盖的方法comparoTo();

Comparator接口:
                1、util包下的接口
                2、自定类不具备比较性时,单独定义一个比较器,实现此接口,交就此类对象传入TreeSet集合中作业构造参数。
                3、需要覆盖的方法compare(); (本接口还有equals()方法,不必覆盖,因为自定义类已经继承了Object中的equals方法。)

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
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()。





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

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

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马