黑马程序员技术交流社区

标题: Comparable和Comparator [打印本页]

作者: 快乐的黑马    时间: 2014-1-3 21:00
标题: Comparable和Comparator
接口 Comparator<T>和接口 Comparable<T>的区别在哪?还有那个要覆盖hashCode()和equals(Object obj)方法也不是很懂,希望高手赐教。

作者: 未来希望    时间: 2014-1-3 21:18
我自己的理解Comparator<T>接口实现的方法需要传入两个参数进行对比而 Comparable<T>接口实现的方法只需要传入一个被比参数
作者: 快乐的黑马    时间: 2014-1-3 21:29
嗯 但这两个除了参数的区别还有啥不同呢?
作者: 净坛使者    时间: 2014-1-3 22:05
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。

一、Comparator

强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

作者: 其LovE斤    时间: 2014-1-3 22:11
Comparator<T>和接口 Comparable<T>
这个两个接口的作用对象是不同的。

Comparator<T>强行对某个对象 collection 进行整体排序 的比较函数。
这个是对集合中的元素进行排序的。

Comparable<T>此接口强行对实现它的每个类的对象进行整体排序。
这个是让某个对象自身具备比较性的。


hashCode()和equals(Object obj)
hashCode()这个涉及到底层是哈希表结构的集合的存储排序问题。
底层是哈希表数据结构的集合存放元素,是根据hashCode()方法算出来的值来判断存放的位置的
同时取出的时候也是根据这个去查找的。
equals(Object obj)是根据引用值来判断两个对象是不是引用的同一个地址。也就是说是根据内存地址
来判断两个对象是不是一样的。如果两个对象的内存地址一样,哈希表结构的集合当然只存一个。
集合在没有序列化以前,内部其实存的是内存地址。
作者: 悠然的我    时间: 2014-1-3 22:20
Comparable和Comparator,可以按语义来理解的。
Comparable是“可比较的”实现它的类可以具有比较性,相当于扩展了类的功能。哥们,我这个类是可比较大小的。
Comparator是“比较器”,专业的么,实现了我,你就是专业的比较器。换句话说,实现该接口的类基本就是个描述比较方法的类。而Comparable则不行,比较性只是它的一个功能而已。
至于具体的应用,毕老师的视频讲的很清楚了,我就不献丑了。
覆盖hashCode()和equals(Object obj)方法,这应该是HashSet集合的要求吧。
Set集合天生就要给大家排队的,要互相比较。要排队当然就要有比较么,Set集合要比出大小高低来,才能往里面存,什么,你跟我一样,不好意思,你进不来。使用set就是为了去重复和排队,看穿这个,其他的就好理解了。我HashSet就靠 hashCode()和equals(Object obj)方法 来实现大家排排队,当然就要写这两个方法了,这就是我的特点,没什么好说的。
作者: 小悠久    时间: 2014-1-4 18:26
Comparable 是给要排序的实体本身实现的接口,而 Comparator 则是第三方。

比如:类 A 实现了 Comparable 接口,表示它可以和另一个 A 比较来达到排序的目的。
但,假设用户想点击按钮“按名字排序”,之后他又想“按QQ号排序”,这样的需求我们用 Comparable 是无法同时满足两种情况的,那么我们就需要第三方 Comparator,当我们在使用 Collections.sort() 方法时传递这个 Comparator 让它来排序。因此 Comparable 里面的方法只需要 1 个参数,因为另一个参数就是这个 A 类实例自己,而 Comparator 需要 2 个参数,它是第三方比较器,接收 2 个参数。
作者: 快乐的黑马    时间: 2014-1-4 19:33
其LovE斤 发表于 2014-1-3 22:11
Comparator和接口 Comparable
这个两个接口的作用对象是不同的。

谢谢!!




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