黑马程序员技术交流社区

标题: Comparable和Comparator的区别是什么? [打印本页]

作者: Leo_yeung    时间: 2013-10-25 23:01
标题: Comparable和Comparator的区别是什么?
谁能告诉我Comparable和Comparator的区别是什么?分别在什么时候使用?
作者: Jim-剣◆﹏    时间: 2013-10-25 23:56
本帖最后由 Jim-剣◆﹏ 于 2013-10-26 00:18 编辑


Comparable是让对象具备比较性的时候用到,对象类实现该接口,然后覆写compareTo()
comparator()是创建比较器的时候要用到,比较器类实现该接口,然后覆写compare()

再给你说说
int compareTo()和int compare方法的区别:
int compareTo()是接口comparable里的方法
int compare()是接口comparator里的方法
两者的内部的比较方式都一样:比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数

再给你总结下什么时候用:用于集合存储元素的时候去除重复元素,如果要判断是否重复元素那就得判断是否相等,判断就得有标准和依据
对于List(ArrayList和LinkedList),比较对象是否相等的依据是:对象的equlas(),所以,一般都要覆写对象的equlas()方法实现自定义的比较标准

对于Set判断对象是否相等要分开讨论,hashSet和TreeSet有不同的机制

对于hashSet,判断对象是否相等首先先判断两对象的hashCode()值是否相等
hashCode()值如果相等,则再判断equals()是否相等
hashCode()值如果不等,那么直接判断两对象不是同一对象
所以,一般对于要用hashSet存储对象的,都要覆写对象的hashCode()+equals()

对于TreeSet,判断对象是否相等的方法既不是根据hashCode,也不是equals
有两种方式,这两种方式就用到了接口comparable和接口comparator(终于和你的问题沾点边了,码字辛苦啊)
第一种:让对象具备比较性,要让对象具备比较性,就要让类去实现comparable这个接口,并且覆写里面的compareTo()方法
第二种:当元素不具备比较性时,需要让集合自身具备比较性,建立建立一个比较器,要建立比较器就要让比较器类实现comparator这个接口,并覆写里面的compare()方法
compareTo()和compare()方法里面的代码基本是一样的...

说完了这个顺带说map的比较方式,map也就分hashMap和TreeMap,是不是觉得很眼熟,是的没错,和楼上的set的内两长得很像
好的我直说了,深夜困了
hashMap的比较方式和hashCode一样
TreeMap的比较方式和TreeSet一样

作者: hurryup    时间: 2013-10-26 00:47
两者都是在TreeSet下存储数据时必须实现的两个接口中的方法。
1.CompareTo()返回int 型,public int CompareTo(Object obj) 让元素具备可比性,首先让集合实现comparable接口,并覆盖Comparable接口,并覆盖CompareTo().
2.Compare()返回int型,public int Compare(Object obj) 让集合具备可比性,首先让集合实现Compartor接口,并覆盖Compare().




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