<b>查抄Comparator接口的契约义务</b>[Java编程]
本文“<b>查抄Comparator接口的契约义务</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
java.util.Comparator接口简单被实现并利用,但是在Comparator的API文档里有些部份还是该当细心阅读一下的.
实现了Comparator接口的类可以传给比方Collections.sort这样的排序办法.它们也可以被Map大概Set类利用,用来保证Map大概Set里的元素始终是按某种次序布列的.TreeSet和TreeMap就是这样的类.
在Comparator接口里,只有一个办法是需求实现的:
int compare(Object o1,Object o2);
假如o1小于o2,返回一个负数;假如o1大于o2,返回一个正数;假如他们相等,则返回0;
这些就是普通为了完成对比所要做的一切,但是在Comparator接口的契约里还有别的义务.
首先,compare办法一定如果对称的,意思是compare(a,b)返回的后果要跟compare(b,a)相反.相反的后果意味着,要末返回的值带有差别的正负号,要末都是0.注意,象compare(a,b)返回4而compare(b,a)返回-2这样的情形是合理的.办法里常常大概抛出非常,在这个办法里抛出非常也如果对称的.假如调用compare(a,b)时抛出了一个ClassCastException非常,那么调用compare(b,a)时也必须抛出一个ClassCastException非常.
考虑下面的代码片断:
public int compareTo(Object o1, Object o2) {
if(o1 instanceof Long) {
Long ln = (Long)o1;
return ln.compareTo(o2);
} else {
return 0;
}
}
假如a是new Long(5),b是”Text”,那么履行compare(o1,o2)将在java.lang.Long的compareTo办法里抛出一个ClassCastException,而履行compare(o2,o1)时将返回0(译者注:原文这里是compare(o1,o2),按照上下文,应当是compare(o2,o1)).
其次,任何你预备重用的Comparator都必须是可序列化的.TreeSet和TreeMap类存储Comparator以便举行对比,因此为了这两个类能被序列化,它们利用的Comparator也必须能被序列化.
第三,假如举行对比操作时,有多种对比办法,那么Comparator该当实现equals办法.开辟者成立有多种对比情势的Comparator是很常见的,比方:
import java.util.Comparator;
public class ExampleComparator {
private int type;
public ExampleComparator(int i) {
this.type = i;
}
public int compareTo(Object o1, Object o2) {
if(type == 1) {
// one type of comparison
....
} else
if(type == 2) {
// another form of comparison
....
}
}
}
Comparator接口,普通被Collections.sort办法利用,它是JAVA中需求理解的一个很重要的部份,因为它有一些重要的契约义务,而它们常常被忽视了.
以上是“<b>查抄Comparator接口的契约义务</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |