黑马程序员技术交流社区

标题: 关于Comparable 和Comparator 区别 [打印本页]

作者: 黑马19我最牛    时间: 2013-4-11 13:41
标题: 关于Comparable 和Comparator 区别
本帖最后由 许兵兵 于 2013-4-11 18:02 编辑

Comparable  和Comparator   
他们在用法有什么区别?
我总是感觉一样.分不清楚.
都分别用在什么地方?
有没有什么比较好点的记忆方法,能让我一下子记住的.

作者: 梁航斌    时间: 2013-4-11 14:01
本帖最后由 梁航斌 于 2013-4-11 14:03 编辑

两个都是接口,但所属类不同。实现比较功能的方式也不同。
Comparable接口作用在类上。使得类强行加上比较性,通过实现compareTo(T o) 获得比较功能。这个接口统称作用在类上。
Comparator接口作用的类是个比较器。运用于集合中,例如TreeSet集合,可以在构造方法中作为比较器传入。通过实现compare(T o1, T o2) 进行比较;equals(Object obj) 判断重复对象。
具体参考Api文档,Comparable在java.lang包中,Comparator在java.util包中。
作者: 刘林虎    时间: 2013-4-11 14:28
comparable&   Comparator    都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)   
   
   而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
作者: 胡滨    时间: 2013-4-11 14:30
Comparator
强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
Comparable
强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。


一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离
作者: 将臣    时间: 2013-4-11 14:49
Comparable 用作默认的比较方式
Comparator 用作自定义的比较方式,当默认的比较方式不适用时或者没有提供默认的比较方式,使用Comparator就非常有用。
Comparator  是不对排序对象本身做修改。
Comparable 则需要排序对象继承
作者: HM朱蛟    时间: 2013-4-11 16:04
本帖最后由 HM朱蛟 于 2013-4-11 16:11 编辑

楼主你好。希望可以帮到你。有不对的希望指出一起学习。

简单的说:
Comparable(内部)和Comparator (外部)都是比较器,
只不过Comparable是集合容器内的对象元素自己主动去实现的让自身具备比较性。
而Comparator 是一个独立的比较器,对他进行定义后传给集合,然后再集合里找对象传入该比较器,2个一组的接收比较。

注意:二者共存时以Comparator 为准。

比较方式:二者(接口)的比较方法(compareTo和compare)都是返回一个int值。根据int值不同来决定参与比较的对象在容器中的位置。
作者: 李大伟    时间: 2013-4-11 16:27
实现comparable  是让对象具有比较性,自动调用里面的compareTo(),实现Comparator是让容器具有比较性,定义一个器 满足我们想要的要求,将比较器传给TreeSet()的构造函数
作者: 蓝色骨头    时间: 2013-4-11 17:27
Comparable  和 Comparator  都是接口
如果一个对象实现了Comparable那么它就具备了比较性
比如一个对象数组的元素具备了比较性就可以使用Arrays的sort方法排序
如果这个对象数组的元素没有实现比较器就必须指定一个Comparator的子类用于排序是的比较,通常是一个内部类。
或者这个对象数组的元素具有比较性,但是你像用其它的属性进行比较时也可以指定一个比较器  


作者: huima    时间: 2013-4-11 19:42
可以这样说吧,Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,而Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
作者: 黄诗宾    时间: 2013-4-11 20:07
本帖最后由 黄诗宾 于 2013-4-11 20:08 编辑

Comparable:让类自身实现接口具备排序功能 覆写CompareTo方法
CompareTo方法为String类的方法  

Comparator:用在自定义比较器
                 单独定义个类实现排序功能
方法:实现Comparator接口覆写Compare方法

我是从读音上区别记忆的:   2个单词前面组成都和compare很相似,最后没有e,一个是able一个是ator。
                  让类具有比较性:Comparable['kɑmpərəbl]  波尔音结尾   可以联想成:类 - 波尔   
                  自定义比较器:Comparator[kəm'pærətə]  瑞特音结尾   可以联想成:自 - 瑞特
                  这只是个比方 怎么读着顺口怎么记忆!
                                   




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