Comparator接口与Comparable接口的区别以及compareTo()方法的介绍

Comparator接口与Comparable的区别

Comparator接口与Comparable接口的详细介绍请转到:Comparator接口与Comparable接口
在这里插入图片描述

紧接着上篇文章,介绍Comparator接口与Comparable接口的区别
Comparator接口位于java.util包下,Comparable接口位于java.lang包下
这两个接口都是用来对自定义对象根据自定义的规则进行排序的接口,类去实现接口并实现它们的核心抽象方法,在核心抽象方法中定义排序规则。最后在测试类中利用调用Collections.sort()方法即可完成排序任务。
不同的是:
Comparator更像是一个单独的工具——比较器,就像上篇文章的案例一样 我们在定义了一个Cat类后 又定义了一个CatNameComparator类让这个类去实现Comparator接口在抽象方法compare()中定义排序规则,compare()方法的参数是两个对象,比如我们对Cat类进行比较,那么这里就是两个要比进行较的Cat类的对象。
在这里插入图片描述
所以可以有一个单独的类去实现Comparator接口 于是这个CatNameComparator类就可以看成一个比较器,在测试类 CatNameComparatorTest中我们调用了Colletions.sort()方法传入了两个参数,一个是CatList一个是 new CatNameComparator(),

		Collections.sort(CatList, new CatNameComparator());//对CatList集合中的对象进行比较,比较的依据就是CatNameComparator类中定义的

这句代码可以读为:对CatList集合中的对象(两两)进行排序,排序的规则就是比较器CatNameComparator中定义的规则。

而Comparable接口我们定义了Goods类直接去实现Comparable接口 在Comparable的抽象方法compareTo()中定义排序规则。compareTo()方法中只有一个对象作为参数,需要进行比较的类要去实现Comparable接口,将当前对象与方法参数中的对象进行比较。
在这里插入图片描述
这里要解释一下Comparable接口中的一个概念当前对象和指定对象
this是指当前对象,也就是测试类中谁调用,那么谁就是this。指定对象是Comparable接口中compare()方法传入的对象
对于上篇文章提到的升序排列变为降序排列只需要调换一下对象的位置即可:这个概念,可以先不深究
当然也可以这么去理解:
compare(o1,o2)方法, 和compareTo(O o)方法,
都是一样的算法
当返回值为负数,也就是说第一个值比第二值小,也就不换位置
当返回值为0,位置不变
当返回值为正数, 也就是说第一次比第二个大,进行换位置,也就是升序。
同理,如果 name2.compareTo(name1); 这样写的话, name2的比name1的大, 那么位置不变,就是所谓的降序了
冒泡排序的感觉。
因此,如果使用Comparator接口,那么要比较的类和实现Comparator接口的类可以分开,如果使用Comparable接口,那么要比较的类就要实现Comparable接口才可以。
具体的一个应用场景:一般情况下对某个类进行排序,比如Cat类,如果使用Comprable接口的方式,那么Cat类需要实现Comparable接口,如果Cat通过Comparable接口的方式实现排序,比如name排序了。我们还希望通过age进行排序,这时不希望修改Cat类,那此时就需要使用Comparator接口了。因此,Comparable接口可以作为实现类的默认排序算法,Comparator则用于一个类的扩展排序。
下面是CompareTo()方法的扩展
在学习Comparable接口的时候,我们用到了CompareTo()方法,用于对对象属性进行比较,根据返回结果进行排序,那么基本数据类型的包装类和字符串也有compareTo()方法,下面分=分别来看一下:
在这里插入图片描述

1、基本数据类型以Integer为例,来看一下Integer类的compareTo()方法

public int compareTo(Integer anotherInteger)

这里的compareTo()方法的参数是要比较的Integer对象
对于返回值,如果调用compareTo()方法的对象等于参数,则返回0,如果大于参数,则返回一个大于0的值,如果小于参数,则返回一个小于0的值
案例代码和运行效果如下,可以看到相等时返回0,大于参数时返回值1,小于参数时返回值-1.
在这里插入图片描述
在这里插入图片描述
String的compareTo()方法
public int compareTo(String antherString)
这个方法是按字典顺序比较两个字符串,比较的是字符串中每个字符的unicode值。
对于返回值,如果两个字符串像等,则返回值为0;如果字符串对象比参数小,则返回一个小于0的数
如果字符串对象比参数大,则返回一个大于0的数。
案例代码和运行效果如下:
在这里插入图片描述
运行效果如下:
在这里插入图片描述
相等的情况比较简单,返回的结果是0.对于小于和大于的情况,可以看到返回结果不都是-1和1,而是不同的值。这时它们之间的比较是unicode值进行减法运算的结果。比如abc和bcd进行比较a比b的unicode值小1,所以结果为-1.而abc与cde比较,a比c的值小2,所以返回值为-2,大于的情况也是如此进行比较的。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立志Java工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值