一、介绍
comparable与comparator都是java.util 下提供的比较器接口,用于两个对象之间的比较关系,其主要区别在与:
comparable:实现comparable接口在于实现接口的类型,某一个对象本身与相同类型的其他对象做比较;
comparator:comparator则是作为一个比较器的存在,不用需要比较的类类实现此接口而起其他类来实现此接口,从而起到一个比较器的作用对某一种类型的数据用于作比较;
简单来说,comparable是本身与相同类型的其他对象做比较,comparator是两个相同类型的数据在某一处做比较。
二、代码
一个用于比较的类、一个测试类,一个比较器类
package com.se.comp;
//用于比较的数据类型,同时使用Comparable 比较
public class Student implements Comparable<Student>{
private int id;
private String name;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int compareTo(Student o) {
if(this.id > o.getId())
return 1;
else if(this.id==o.getId())
return 0;
else
return -1;
}
}
//测试类,同时充当比较器的存在
package com.se.comp;
import java.util.Comparator;
public class MianTest<E> {
public static void main(String[] args) {
Student s1 = new Student(1,"张珊");
Student s2 = new Student(2,"张珊");
Student s3 = new Student(1,"张珊");
System.out.println(s1.compareTo(s2));
System.out.println(s2.compareTo(s1));
System.out.println(s1.compareTo(s3));
System.out.println((6-1>>>1)+"=============");
StudentComp comp = new StudentComp();
new MianTest<Student>(s1,s2,comp);
MianTest<Student> cp = new MianTest<Student>(comp);
System.out.println(cp.compara(s1, s2));
System.out.println(cp.compara(s2, s1));
System.out.println(cp.compara(s2, s2));
}
public MianTest() {
super();
}
public MianTest(E e1, E e2, Comparator<E> ct) {
super();
this.e1 = e1;
this.e2 = e2;
this.ct = ct;
}
//传入一个比较器
public MianTest(Comparator<E> ct) {
super();
this.ct = ct;
}
private E e1;
private E e2;
private Comparator<E> ct;
public int compara(){
return ct.compare(e1, e2);
}
//比较两个数据
public int compara(E e1,E e2){
return ct.compare(e1, e2);
}
}
//比较器
package com.se.comp;
import java.util.Comparator;
public class StudentComp implements Comparator<Student>{
@Override
public int compare(Student s1, Student s2) {
if(s1.getId()>s2.getId())
return 1;
else if(s1.getId()==s2.getId())
return 0;
else
return -1;
}
}
说个比较形象的说法:
举个两人比较身高的例子,A和B两人需要比较身高,comparable是A与B背对背站在一起比较直接可以看出结果,可以把A或B看做比较对象(就是调用comparaTo方法的对象);comparator则是A与B分别在测量身高仪器上进行测量,然后比较两人的测量数据;