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,用户可以使用它在外部(某个内置比较规则或没有比较规则的类的外部)自定义符合自己需求的比较规则。
上一篇: 稀疏矩阵与矩阵块乘法
下一篇: maven入门
推荐阅读
-
浅析php中抽象类和接口的概念以及区别
-
Java中HashMap和TreeMap的区别深入理解
-
浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别
-
详解JAVA中接口的定义和接口的实现
-
PHP中抽象类和接口的区别
-
java 抽象类和接口的区别详细解析
-
Java中parseInt()和valueOf(),toString()的区别
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
-
java中的sleep()和wait()的区别
-
Java中成员变量与局部变量的区别、对象类型作为方法的参数和方法的返回值