Java集合排序——关于compareTo方法、Comparable和Comparator的区别
- 关于compareTo()方法
- Comparable和Comparator的区别
关于compareTo()方法
在学习Comparable接口时,我们用到了compareTo()方法,用于对对象属性进行比较,根据返回结果进行排序。那么基本数据类型的包装类和字符串也都有compareTo()方法,下面分别来看一下:
- 基本数据类型以Integer为例,来看一下Integer类的compareTo()方法
public int compareTo(Integer anotherInteger)
这里的compareTo()方法的参数是要比较的Integer对象
对于返回值,如果调用compareTo()方法的对象等于参数,则返回0;如果大于参数,则返回一个大于0的值;如果小于参数,则返回一个小于0的值。
案例代码和运行效果如下,可以看到相等时返回0,大于参数时返回值1,小于参数时返回-1。
运行结果:
- String的compareTo()方法
public int compareTo(String anotherString)
这个方法是按字典顺序比较两个字符串,比较的是字符串中每个字符的unicode值。
对于返回值,如果两个字符串相等,则返回值为0;如果字符串对象比参数小,则返回一个小于0的数;如果字符串对象比参数大,则返回一个大于0的数。
案例代码和运行效果如下:
运行结果:
相等的情况比较简单,返回的结果是0。对于小于和大于的情况,可以看到返回结果不都是-1和1,而是不同的值。这是它们之间的比较时,unicode值进行减法运算的结果。比如abc和bcd进行比较,a比b的unicode值小1,所以结果为-1。而abc与cde比较,a比c的值小2,所以返回值为-2。大于的情况也是如此进行比较的。
Comparable和Comparator的区别
前面我们已经学习过Comparator和Comparable接口的使用,下面来总结一下二者的区别。
- Comparator接口位于java.util包下,而Comparable接口位于kava.lang包下。
- 对于Comparator接口,可以看到它的compare()方法的参数时两个对象,比如我们对Cat类进行比较,那么这里就是两个要比较的Cat类的对象,所以可以有一个单独的类实现Comparator。
对于Comparable接口,它的方法只有一个对象作为参数,所以要比较的类需要实现Comparable接口,将当前对象与方法参数中的对象进行比较。
因此,如果使用Comparator接口,那么要比较的类和实现Comparator接口的类可以分开;如果使用Comparable接口,那么要比较的类就要实现Comparable接口才可以。
3. 关于应用场景
一般情况下如果对某个类进行排序,比如Cat类,如果使用Comparable接口的方式,那么Cat类需要实现Comparable接口。如果Cat类通过Comparable接口的方式实现排序,比如通过name排序了。那么我们还希望通过age进行排序,这时不希望修改Cat类,那此时就需要使用Comparator接口了。
因此,Comparable接口可以作为实现类的默认排序算法,Comparator接口则用于一个类的扩展排序。