Comparable
Comparable是一个接口,当一个类实现该接口的时候,就要实现compareTo方法,同时也意味着该类是可以比较的。该类型的对象数组或列表可以用Arrys.sort或者Collections.sort进行自动排序。该接口定义如下:
public interface Comparable<T> {
public int compareTo(T o);
}
compareTo方法返回该对象和目标对象的比较值,如果该对象小于目标对象,则返回一个负值,如果二者相等则返回0,否则返回一个正值。
现在有一个实现了Comparable接口的Person类:
package compare;
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return age - o.getAge();
}
}
写一个main方法来测试:
package compare;
import java.util.Arrays;
public class ComparableMain {
public static void main(String[] args) {
Person[] mPersons = new Person[3];
mPersons[0] = new Person("小明", 18);
mPersons[1] = new Person("小白", 25);
mPersons[2] = new Person("小王", 20);
Arrays.sort(mPersons);
for(Person p:mPersons){ System.out.println("name="+p.getName()+",age="+p.getAge());
}
}
}
排序后:
Comparator
Comparator也是一个接口。如果我们想对一个类进行比较,但是该类并不支持排序,即没有实现Comparable接口,这时我们就可以实现Comparator创建一个比较器来进行比较。该接口定义如下:
public interface Comparator<T>
{
int compare(T o1, T o2);
boolean equals(Object obj);
}
compare方法返回两个参数的比较值,如果第一个参数小于第二个,则返回一个负值,如果二者相等则返回0,否则返回一个正值。
equals方法可以不用实现,仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
现在有一个Person类:
package comparator;
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
实现一个Person的比较器:
package comparator;
import java.util.Comparator;
public class PersonComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.getAge() - o2.getAge();
}
}
写一个测试类:
package comparator;
import java.util.Arrays;
public class ComparatorMain {
public static void main(String[] args){
Person[] mPersons = new Person[3];
mPersons[0] = new Person("小明", 30);
mPersons[1] = new Person("小白", 25);
mPersons[2] = new Person("小王", 20);
Arrays.sort(mPersons,new PersonComparator());
for(Person p:mPersons){
System.out.println("name="+p.getName()+",age="+p.getAge());
}
}
}
排序后:
区别
Comparable是一个排序接口,Comparator是一个比较器。实现了Comparable接口的类则意味着支持排序。而对于没有实现Comparable接口又想进行比较的类则可以通过实现Comparator创建一个比较器进行比较。Comparable是在类的内部比较,Comparator则是在类的外部比较。