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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ╭月牙湾湾╮ 中级黑马   /  2014-6-21 14:21  /  1856 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

compare、comparable、comparator和compareTo之间是什么关系,应该怎么应用,请分别解释一下。

6 个回复

倒序浏览
compareTo是Compareable接口的一个方法,主要用于规定创建对象的大小关系,该对象要实现compareable接口, 当a.compareTo(b)>0时,则a>b, 当a.compareTo(b)<0时, a<b.
compare方法是java.util中的Comparator接口的一个方法,compare方法内主要靠定义compareTo规定的对象大小关系来确定对象的大小。

回复 使用道具 举报
在网上看到的:handshake
回复 使用道具 举报
区别:

相同:comparable 和 Comparator 都是用来实现集合中的排序的(不是集合实现了这两接口,是集合里装的东西会去实现这两个接口)
区别:

Comparable是在集合内部定义的方法实现的排序
Comparator是在集合外部实现的排序

所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()  

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)   
   
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。



其实很简单,单从字面理解就基本明白了。

Comparable,“可比较的”。

使用这种策略来比较时,两个对象本身必须是“可比较的”,比较的标准由对象所在的类定义,这种可比较的能力是对象本身固有的,因此不需要第三者参与就可以完成比较。compareTo()方法只要一个参数,因为这里只有“你”“我”的关系,没有第三者。

比如,两个人要比较身高,分辨高矮是人类固有的能力,两个人只要站到一起就能分出谁高谁矮。

Comparator,“比较器”。

使用这种策略来比较时,如何进行比较和两个对象本身无关,而是由第三者(即比较器)来完成的。只要实现Comparator接口,任何一个对象都可能成为一个“比较器”,但比较器并不是比较自己的实例,而是比较另外两个对象,比较器在这里充当“仲裁者”的角色,这也就是为什么compare()方法需要两个参数。

比如,两个人要比较谁智商更高,靠他们自身无法进行,这时要借助一个比较器(比如,智商测试题)。



不足和互补:

因为compareTo()方法约定:本对象大于另一个对象时,返回大于0的整数,小于时返回小于0的整数,等于时返回0。
但是,这种排序是非常不灵活的:

第一,需要修改集合元素类Employee,而很多情况下,我们没有办法修改公共的类。
第二,没有办法实现多种方式排序,如按编号,按姓名,按薪水等等。

这时需要使用另一种策略,即Comparator。Comparator使用其compare()方法返回的整数来比较两个对象,规则和compareTo()一样。

如同样实现年龄比较,使用Comparator时,无需修改Employee类,可以在排序的时候定义相应的比较器。

回复 使用道具 举报
★飓风★ 发表于 2014-6-21 16:10
区别:

相同:comparable 和 Comparator 都是用来实现集合中的排序的(不是集合实现了这两接口,是集合里 ...

好详细的回答。我会认真看的,谢谢你了。
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
马宁 中级黑马 2014-6-21 21:52:08
7#
来学习下的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马