Java中Comparable和Comparator接口的区别

背景:在学习数据结构二叉堆之后,想通过练习一些题目来加深对知识的理解。在问题解决过程中遇到了一个问题:我实现的堆是最大堆,堆顶元素是最大值(针对Integer类型来说),但是我希望堆顶元素是最小值。换句话说,对于Integer类型,java通过Comparable接口内置了比较规则,即符合算数逻辑运算的 “1小于2”。但是,我的需求是“1大于2”,这就需要我在外部通过Comparator定义新的比较规则,即数字小的比较大

一、接口定义

以下内容参考JAVA API官方文档。
泛型接口Comparable ,读音:美/ˈkɑːmpərəbl/ ,意思:可比较的。从意思上可知, 实现了该接口的类的对象都是可以比较大小的,它使对象内置了属于它自己的,常规的比较规则。例如,对于Integer类型,Java内置的比较规则和数学中的逻辑运算规则相同。对于String类型,Java内置的比较规则是字典序,即在英语字典中的位置靠前表示比较小。
package java.lang

Interface Comparable<T> {
   int compareTo(T o);
}

参数:
o -被比较的对象。
返回:
该对象小于、等于或大于指定的对象时,分别返回一个负整数、零或正整数,
抛出异常:
NullPointerException—如果指定的对象为空
ClassCastException—如果指定对象的类型无法强制类型转换成和该对象相同的类型

泛型接口Comparator ,读音:/kəmˈpærətər/ ,意思:比较器。从意思上可知,用户可以使用它在外部(某个内置比较规则或没有比较规则的类的外部
)自定义符合自己需求的比较规则。

java.util
Interface Comparator<T>{
   int compare(T o1,  T o2);
   
   ... //此处省略了该接口中定义的其他的方法,仅介绍常用、主要的方法
}


参数:
o1 -第一个要比较的对象。
o2 -第二个要比较的对象。
返回:
第一对象小于、等于或大于第二个对象时,分别返回一个负整数、零或正整数,
抛出:
NullPointerException—如果参数为空,并且这个比较器不允许空参数
如果参数的类型阻止比较器对它们进行比较,则ClassCastException异常。

二、使用方法

在这里通过一个简单案例,说明下上述两个接口的使用时机和使用方法。

假设一个场景:在公交车上年龄小的总是给年龄的人让座。代码及运行结果如下:

Person类,实现了Comparable接口,内置比较规则,年龄大的则“大”。
在这里插入图片描述
Bus类,定义了让座规则,给优先级高者让座

在这里插入图片描述

意外发生了,三岁的孩童给博主让了座位,我没有同意(车身上人太多了)。我觉得Person类内置的比较规则,年龄大者“大”,换句或者,年龄大者优先级高,现在已无法完全满足我的要求了,我需要在Person类外部,即Bus类中定义新的比较规则,使得年龄小者“大”或年龄小者优先级高

Person类内置比较:年龄大者“大”,目前的新需求:年龄小者“大”。
于是我实现了Comparator接口:

在这里插入图片描述
在这里插入图片描述
以上案例,仅为了方便理解,可能存在不合理之处。

三 总结

泛型接口Comparable,实现了该接口的类的对象都是可以比较大小的,它是对象内置了属于它自己的,常规的比较规则。

泛型接口Comparator,用户可以使用它在外部(某个内置比较规则或没有比较规则的类的外部)自定义符合自己需求的比较规则。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

明月几时有666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值