区别:
相同: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类,可以在排序的时候定义相应的比较器。
Java中compareTo和compare的区别
compare方法是java.util中的Comparator接口的一个方法,compare方法内主要靠定义compareTo规定的对象大小关系来确定对象的大小。 ——————————————————————————————————————————————————————————————— java compare 降序/升序怎么确定
private class ComparatorList implements Comparator {
public int compare(Object arg0, Object arg1) {
ErpAccountCheckDetail cd1 = (ErpAccountCheckDetail)arg0;
ErpAccountCheckDetail cd2 = (ErpAccountCheckDetail)arg1;
return cd1.getCheckDate().compareTo(cd2.getCheckDate());
}
}
return cd1.getCheckDate().compareTo(cd2.getCheckDate());返回值是怎么确定升序降序的,返回值不是有可能为1,-1,0吗,是怎么确定升序或是降序的
答:我印象中如果不重写compareTo方法那返回值都是-1吧......
我一般都是实现Comparable接口,重写CompareTo方法就可以了。
至于降序升序,可以这样比较:
假如A的值大于B,你返回1。这样调用Collections.sort()方法就是升序
假如A的值大于B,你返回-1。这样调用Collections.sort()方法就是降序
一般比较的都是对象中一个具体的数值。不知道你的类的构造,不好给例子
追问
cd1.getCheckDate().compareTo(cd2.getCheckDate())返回值不是一会1,一会-1吗,到底什么时候升序什么时候降序呢
回答
怎么会?你用System.out.println(cd1.getCheckDate().compareTo(cd2.getCheckDate()))打印出结果看的吗?
追问
结果每次不一样
回答
cd1.getCheckDate()
返回什么类型的值?Date还是String? ——————————————————————————————————————————————————————————————— 接口API:
*
* @param lhs
* an {@code Object}.
* @param rhs
* a second {@code Object} to compare with {@code lhs}.
* @return an integer < 0 if {@code lhs} is less than {@code rhs}, 0 if they are
* equal, and > 0 if {@code lhs} is greater than {@code rhs}.
* @throws ClassCastException
* if objects are not of the correct type.
*/
public int compare(T lhs, T rhs);