面试题:试比较Comparable和Comparator的区别?
-
如果对象数组需要排序,那么就必须设置排序规则,就要使用这两种比较器
-
对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等
-
对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现
对于jdk1.8而言,有三种实现对象比较的方法:
-
覆写Object类的equals()方法;
-
继承Comparable接口,并实现compareTo()方法;
-
定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
实践举例:
通过使用比较器,将学生对象的内容进行排序,并输出
第一种情况:使用Comparable比较器,实现Comparable接口,并重写compareTo方法,通过调用Collections.sort()来实现排序
定义Student类实现Comparable接口
public class Student implements Comparable<Student>{
private int num;
private String name;
private double scores;
//生成构造
public Student(int num1,String name1,double scores1) {
num = num1;
name = name1;
scores = scores1;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScores() {
return scores;
}
public void setScores(double scores) {
this.scores = scores;
}
@Override
public String toString() {
return "Student [num=" + num + ", name=" + name + ", scores=" + scores + "]";
}
public int compareTo(Student s) {
int i = (int) (this.getScores()-s.getScores());
return i;
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test1{
public static void main(String[] args) {
// 定义一个List集合,向集合中加入五个学生对象,使用比较器将内容排序输出
List<Student> list1 = new ArrayList<>();
list1.add(new Student(001,"tiffany",100000.0));
list1.add(new Student(002,"jeff",20000.0));
list1.add(new Student(003,"sarah",30000.0));
list1.add(new Student(004,"hanmm",40000.0));
list1.add(new Student(005,"ella",10000.0));
// Arrays.sort(list1, new StudentComparator());
Collections.sort(list1);
for (Student s : list1) {
System.out.println(s.getNum()+" "+s.getName()+" "+s.getScores());
}
}
}
第二种情况:使用Comparator比较器来实现。重新定义一个StudentComparator类实现Comparator接口,并重写里面的compare方法,在测试方法中依然调用Collections.sort( , )来实现对集合进行排序
//根据学号进行排序
importjava.util.Comparator;
public class StudentComparator implements Comparator<Student >{
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return (int) (o1.getNum()-o2.getNum());
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test1{
public static void main(String[] args) {
// 定义一个List集合,向集合中加入五个学生对象,使用比较器将内容排序输出
List<Student> list1 = new ArrayList<>();
list1.add(new Student(001,"tiffany",100000.0));
list1.add(new Student(003,"jeff",20000.0));
list1.add(new Student(007,"sarah",30000.0));
list1.add(new Student(004,"hanmm",40000.0));
list1.add(new Student(005,"ella",10000.0));
// Arrays.sort(list1, new StudentComparator());
Collections.sort(list1, new StudentComparator());
for (Student s : list1) {
System.out.println(s.getNum()+" "+s.getName()+" "+s.getScores());
}
}
}
这两种情况都是调用了Collections.sort方法,只是参数不同,注意区分