java 比较器 Comparable Comparator区别
java 比较器 Comparable Comparator区别
对于JDK8而言,有三种实现对象比较的方法:
- 1、重写Object类的equals()方法;
- 2、继承Comparable接口,并实现compareTo()方法;
- 3、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
使用学生类举例:
public class Student implements Comparable<Student>
{
private String name;
private int age;
//构造方法,set,get,toString方法省略
}
重写Object类的equals()方法;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
此方法只适合比较是否相等。
继承Comparable接口,并实现compareTo()方法;
需要重写compareTo()方法。是封装的类继承的。
Student继承Comparable,例如根据年龄大小排序
public class Student implements Comparable<Student>
{
private String name;
private int age;
//构造方法,set,get,toString方法省略
@Override
public int compareTo(Student s) {
return this.age-s.age;
}
用途TreeSet,TreeMap等添加对象。如果不继承Comparable,不能添加。
定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
JDK1.8开始出现了Comparator接口,它的出现解决了当需要在已经开发好的代码基础上完善对象的比较功能时不想更改之前的代码的问题。
按从小到大的排列,o1,o2是比较的两个对象,o1比o2大,返回正数1,小返回-1,相等返回0。
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1,Student o2) {
if(o1.getAge() > o2.getAge()){
return 1;
}else if(o1.getAge() < o2.getAge()){
return -1;
}else{
return 0;
}
}
}
可以在TreeSet,TreeMap,Arrays.sort等使用。
也可以不单独写这个类,使用匿名内部类
TreeSet<Student> set= new TreeSet<Student>( new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return 0;
}
} );
注意:在TreeSet,TreeMap等类的数据结构中,以上两种方法内部比较的类的属性要写完整,不然,会造成数据丢失。
例如Student,我只写了按照age比较,当添加两个或多个age相同的对象,只会保留最后一个添加的。
Arrays.sort的排序没有关系。