import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
//实现Comparable接口;
public class Person implements Comparable<Person> {
private String name;
private int age;
@Override
public int compareTo(Person o) {
int i = this.age - o.getAge();
return i;
}
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;
}
//沒有实现Comparable接口
static class Person1{
private String name;
private int 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;
}
}
//实现Comparable,重寫比較方法
private void sort1(){
Collections.sort(new ArrayList<Person>());
}
//需要比較的類已無法更改(没有实现Comparable),排序时創建比較器
private void sort2(){
Collections.sort(new ArrayList<Person1>(), new Comparator<Person1>() {
@Override
public int compare(Person1 o1, Person1 o2) {
int j = o1.getAge() -o2.getAge();
return j;
}
});
}
引用一段解释:
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
Comparator接口中定义了两个方法,为什么实现类创建对象的时候只需重写一个compare()方法?
实际上,我们知道当一个类没有显式继承父类的时候,会有一个默认的父类,即java.lang.Object,在Object类中有一个方法即为equals方法,所以这里并不强制要求实现Comparator接口的类要实现equals方法,直接调用父类的即可;
----------------------------------------------------------------------------------------------------------------------
总之来说,Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。
我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。