前言:
通过对Comparable,Comparator的理解,我们可以试着完成一下对sort的模拟实现,理解sort内部的构造,加深代码的理解,以及加强接口的理解,从而能够写出优质代码。
我们知道,一般比较大小取决于类型,比如int类和int类比,double类和double类比,但是,对于String类还有我们自定义类,能进行比较嘛?如何去比?下面就来写写看。
先定义一个学生类:
如果int能和int进行比较,那么student类能和student类进行比较嘛?
答案是不能直接比较的,因为编译器不确定是通过什么方法比较,比如让sort方法进行排序,编译器会报错
那我们该如何使其能成功比较并且排序呢?
接口——Comparable:
想要成功比较,就需要我们的Comparable接口,并且实现compareTo方法
我们看看Comparable内部:
<T>中的T是涉及泛型的内容,可以将T看成是Object,指定类型,可以指定为学生类,相当于利用compareTo方法进行学生类的比较。
里面有个compareTO方法,形参实际是Object,重载着许多比较的实现方法,
例如String类的比较方法
可以看到,是用首字母进行比较的,接下来就在我们的学生类里面实现一个接口的方法:
重写compaTo方法:
name为String类,相当于再次引用了Object类的compareTo方法,形参为String
age为int类,该类直接依靠返回值来比较即可
通过名字比较,得到:
这样我们就知道了如何比较自定义类型,下来我们继续看看如何模拟实现sort
sort方法内部:
其他的内部实现很复杂,我们只看形参,可以为任何类型,且传入的类型都是可比较的,这个归结于compareTo方法(在sort方法中会自动调用compareTo方法,compareTo方法的参数是Object)
既然参数列表为Object[],我们就可以直接定义一个Comparable接口数组形参类型,用来执行排序功能
但是还有个问题,在compTo内部的方法已经写死了,用了名字就不能再用年龄了,这时候该如何解决呢?答案是换接口
接口——Comparator:
Comparator内部:
它有个compare方法,用来进行俩个类型的比较
我们可以采用俩个接口的方式,一个接口使用年龄排序,另外一个接口采用名字排序
年龄排序:
名字排序:
比较方法的使用:
sort的第二个参数:
我们知道sort方法重载了很多方法,其中包括这个,第二个参数可以选定比较方法,来实现多样化的比较方式,不用局限于固定的方式
希望各位多多指教