Comparator和Comparable

Comparator和Comparable

 

首先Comparable,从able后缀就可以看出,表示可被...,这里Comparable就表示可被比较的

我们知道基本的数据类型是可以很容易的进行比较的,比如说3>1,对于这种数字之间的比较我们很容易得出结论:大于,小于或者等于
但是对于引用类型(自定义的类)就很难进行比较了,因为类的字段一般包括多个基本的数据类型或者引用类型。
这时,引用类型之间改如何比较就需要我们来定义了。
比如说,定义一个学生类,有姓名和年龄两个属性,我们规定比较按年龄来,年龄大的学生对象就大于年龄小的学生对象。
如果说只有两个对象的比较,我们可以直接通过get得到年龄再进行比较,如果是多个对象之间的比较排序呢?
这时我们为了代码的可重用性是不是就应该抽取一个方法了?

我们把对象比较的方法放入类中应该是最合适的做法,Comparable接口正是基于这种需求设计的。
Comparable接口要求我们实现的方法只有一个

 

 

Comparable采用了泛型,一般应该也是泛型为本类对象,这个不管
再回到基本数据类型的比较,3>1,我们发现比较有两个东西
1.两个对象
2.比较后的结果,是大于,小于,还是等于
再看上面类中的compareTo方法
第一个这个比较好理解,首先执行这个方法有一个本对象的引用this,方法传入了一个对象就有两个对象了
第二个就是比较后的结果了,这个我们可以自定义,我们说大于返回0,-1,1都没什么问题。
但是这里要注意如果你的对象要使用Collections或者Arrays工具类来进行排序的话,这里就必须按照要求来了

再啰嗦下,为什么是Collections和Arrays有sort方法呢?
因为排序肯定是需要一堆数据嘛,一堆数据在java中还能怎么存,不只有数组和集合嘛,笑

那么比较后的结果返回值要求是什么呢?
我们来看看sort方法的原形

 



第一个参数没什么可说的,是要排序的数据
可以看出啊,关键是第二个参数Comparator,百度了下,翻译叫比较器

 

 

那么,到底是怎么实现的呢?
首先,参考基本数据类型的排序,例如冒泡排序,肯定是需要进行两个数值比较之后再交换位置的
上面代码传入了1.一堆数据的集合,2.实现了Comparator接口的匿名实现类
因为工具类要对我们的对象进行排序,它不知道我们对象该如何比较
所有我们要指定对象比较的规则,这里Comparator接口应该是我们对象比较的策略(参考设计模式之策略模式)

这里的compare和上面实现Comparable接口的compareTo有点相似,其实我们可以看出就是调用了compareTo方法
我们还是不明白这个返回值到底什么意思
深入源码去看看

 

进去一层发现,集合工具类最终调的还是数组工具类的sort排序方法

再进去看看
算了,跟不进去了,mergeSort,快速排序,递归,二分混着用看得我头皮发麻。有空再研究

直接说结果吧
排序时比较调用了Comparator接口匿名实现类的compare方法
compare和compareTo返回值大于0,表示第一个比第二个大,等于0表示一样,小于0表示小于
和基本数据类型一样



写成这样也是可以的

sort排序默认是升序排列,如果想要降序排列,取个反就行了(在comapre里面调用compareTo方法取反)

总结:Comparator和Comparable都是接口
Comparable是对对象的增强,让对象具有可以比较的属性
Comparator是使用工具类对集合和数组进行排序时的用到的策略接口,实现在对象排序时如何比较对象

也可以不实现Comparable接口,而直接在Comparator的compare方法中指定对象的比较方法

需要注意的是:
1.compare和compareTo方法返回值,如果大于0,表示第一个大于第二个,等于0表示相等,小于0表示第一个小于第二个
其实排序方法里只有>0和<=0两种判断
2.默认排序时升序,想要让其降序排列,取反


3.最好的方式是
a.对象实现Comparable接口,Comparable接口的compareTo方法,定义大于是>0,其它是<0;不关心等于,你判断对象相等也不是通过compareTo方法来判断。
b.在sort是compare方法里面直接调用compareTo方法,如果想降序排列,取反

Comparable意义是:对象的比较应该是对象本身的一种属性,定义在对象类中才更加的合理

 

转载于:https://www.cnblogs.com/Zanpo/p/10290334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值