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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Leo_yeung 中级黑马   /  2013-10-25 23:01  /  2191 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能告诉我Comparable和Comparator的区别是什么?分别在什么时候使用?

2 个回复

倒序浏览
本帖最后由 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一样
回复 使用道具 举报
两者都是在TreeSet下存储数据时必须实现的两个接口中的方法。
1.CompareTo()返回int 型,public int CompareTo(Object obj) 让元素具备可比性,首先让集合实现comparable接口,并覆盖Comparable接口,并覆盖CompareTo().
2.Compare()返回int型,public int Compare(Object obj) 让集合具备可比性,首先让集合实现Compartor接口,并覆盖Compare().
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马