欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中Comparable和Comparator接口的区别

程序员文章站 2022-05-22 13:08:08
...

背景:在学习数据结构二叉堆之后,想通过练习一些题目来加深对知识的理解。在问题解决过程中遇到了一个问题:我实现的堆是最大堆,堆顶元素是最大值(针对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接口,内置比较规则,年龄大的则“大”。
Java中Comparable和Comparator接口的区别
Bus类,定义了让座规则,给优先级高者让座

Java中Comparable和Comparator接口的区别

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

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

Java中Comparable和Comparator接口的区别
Java中Comparable和Comparator接口的区别
以上案例,仅为了方便理解,可能存在不合理之处。

三 总结

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

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

相关标签: javaSE 接口