Java中Compareable和Comparator两种比较器的区别
参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html
1.引言
在java这个处处是对象的世界里,对两个对象进行按某一属性进行比较是特别常见的需求。比如书店中的书按照价格比较,亦或者是学生按照成绩进行排名等等。
对于JDK8而言,有三种实现对象比较的方法:
1、在需要比较的对象类中覆写Object类的equals()方法;
2、需要比较的类继承Comparable接口,然后在其类内部实现compareTo()方法;
3、抛去需要被比较的类,在其外部自定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。
第一种方法比较便于理解,复写equals()方法一般用于自己实现的对象数组排序,已经在我们上一篇文章 Java的equals方法的使用技巧 中进行了简单介绍,需要了解的朋友可以自行查看。本文我们主要介绍内部比较器compareable和外部比较器comparator两种。
2.内部比较器Compareable的用法
这种方式就是让自己编写的类继承Comparable接口,并实现接口的compareTo()方法,这种情况下,在使用java.util.Arrays.sort()方法时不用指定具体的比较器。
以书店的图书为例,具体实例代码如下:
1 import java.util.Arrays; 2 3 class BookCook implements Comparable<BookCook>{ 4 private String title; 5 private double price;
6 public BookCook(String title,double price){ 7 this.title = title; 8 this.price = price; 9 }
10 @Override 11 public String toString() { 12 return "书名:"+this.title+",价格:"+this.price; 13 }
14 @Override 15 public int compareTo(BookCook o) { 16 if(this.price > o.price){ 17 return 1; 18 }else if(this.price < o.price){ 19 return -1; 20 }else{ 21 return 0; 22 } 23 } 24 }
在写代码时要注意两点:
(1)时刻要统一比较对象,在这里就是BookCook
(2)在重写的compareTo()方法中,需要特别注意的是,返回值的正负始终与this待比较对象保证同步,即当this值比指定对象大时,就返回正数1,小于时就返回负数-1,相等时就返回0.
3.外部比较器Comparator的用法
从JDK1.8开始出现了Comparator接口,它的出现解决了当需要在已经开发好的代码基础上完善对象的比较功能时不想更改之前的代码的问题。这种情况下,我们就需要单独自定义一个对象比较器,继承Comparator接口。当需要进行比较时,就new一个对象比较器。
以学生成绩为例,具体实现代码如下:
1 class Student { 2 private String name; 3 private double score; 4 public Student(String name,double score){ 5 this.name = name; 6 this.score = score; 7 } 8 public double getScore(){ 9 return this.score; 10 } 11 @Override 12 public String toString() { 13 return "姓名:"+this.name+",分数:"+this.score; 14 } 15 16 }
//自定义对象比较器 17 class StudentComparator implements Comparator<Student> { 18 @Override 19 public int compare(Student o1,Student o2) { 20 if(o1.getScore() > o2.getScore()){ 21 return 1; 22 }else if(o1.getScore() < o2.getScore()){ 23 return -1; 24 }else{ 25 return 0; 26 } 27 } 28 } 29 public class TestComparator { 30 31 public static void main(String[] args) { 32 33 Student[] sts = new Student[]{ 34 new Student("小戴",60), 35 new Student("小王",90), 36 new Student("老王",80), 37 new Student("小萱",95) 38 }; 39 //当需要比较功能时,需要在待比较对象后new一个自定义的比较器,以便其按照自定义比较器中的规则进行比较。 40 java.util.Arrays.sort(sts, new StudentComparator()); 41 System.out.println(java.util.Arrays.toString(sts)); 42 } 43 }