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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹昌豪 中级黑马   /  2012-5-22 19:08  /  1579 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

童鞋们都知道的,comparable和comparator接口,是比较器。
前者的compareTo是按照自然排序的方法,不需要覆写,但是当我们仍然要覆写它,覆写以后为什么还是叫做自然排序方法。
而后者中的compare方法怎被称为自定义排序方法。
要怎么解释才好,光会用不行啊,还得能说出来才好

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
理解不对,两个本质上是一样的
comparable 是写在需要比较的类的里面的
comparator 独立于需要比较的类
其他都是一样的,里面都可以实现自然排序和自定义排序

评分

参与人数 1黑马币 +6 收起 理由
曹昌豪 + 6

查看全部评分

回复 使用道具 举报
comparable是在类里面定义的方法是吧,comparator是一个类,要把对象传入到要比较的类里面去的啊!!唉,说不好,
回复 使用道具 举报
关于Comparable:
  1. public interface Comparable<T>
  2. 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
复制代码
关于Comparator:
  1. public interface Comparator<T>
  2. 强行对某个对象 collection 进行整体排序 的比较函数。
复制代码
定义上就不同,Comparable是直接从本质上改变元素的比较性,让一个类的对象的比较方法在原则上被定义。因此称作自然排序。
Comparator是我们自定义的排序方法,并封装成一个单独的类,作为参数传递给需要排序的列表或数组。
操作方法的不同,也就造成了概念的不同。
不知道这么说楼主是否理解了。

评分

参与人数 1黑马币 +10 收起 理由
曹昌豪 + 10

查看全部评分

回复 使用道具 举报
好像理解了点,那个Comparator封装成一个单独的类可以理解,前面那个哥们说的太抽象了,再直接点....
回复 使用道具 举报
嗯,LZ问的重写compareTo为什么还叫自然顺序的问题,是在我们进行比较时,两种不同的使用方式而言的,一个类实现了comparable,在进行比较的时候,不需要再指定比较器,如:TreeSet<Integer> set = new TreeSet<Integer>(); 用实现comparator接口的方法,我们在比较的时候,需要指定比较器,如:TreeSet<Integer> set = new TreeSet<Integer>(new IntegerComparator());

评分

参与人数 1黑马币 +8 收起 理由
曹昌豪 + 8

查看全部评分

回复 使用道具 举报
余宏 中级黑马 2012-5-22 19:25:18
7#
Comparable 是一个自身已经支持自比较的接口
Comparator 是一个比较器 ,当对象本身 不支持自排序和自比较函数的时候 ,我们可以通过实现Compartor 来比较两对象的大小
Comparable 是一个比较通用的接口 用户可以通过他实现 排序功能 ,而 Comparator 可以看作一种算法 一种设计模式 ,
Comparable 相对比较固定, Comparator 比较灵活 ,可以与任何需要实现功能的类 绑定 ,Comparable 是 静态绑定
Comparator 是动态绑定

评分

参与人数 1黑马币 +8 收起 理由
曹昌豪 + 8

查看全部评分

回复 使用道具 举报
恩恩,可以了,多谢同学不吝赐教,论坛提问真挺好啊,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马