Comparable與Comparator的區別
Comparable & Comparator
都是用來實現集合中元素的比較、排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator
是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義Comparator
接口的方法或在集合內實現 Comparable
接口的方法,Comparator
位于包java.util下,而Comparable
位于包java.lang下。
Java中有兩種方式來提供比較功能。第一種是實現java.lang.Comparable接口,使你的類天生具有比較的能力,此接口很簡單,只有一個compareTo
一個方法。此方法接收另一個Object為參數,如果當前對象小于參數則返回負值,如果相等則返回零,否則返回正值,也就是:
x.compareTo(y) 來“比較x和y的大小”。若返回“負數”,意味著“x比y小”;返回“零”,意味著“x等于y”;返回“正數”,意味著“x大于y”。
使用Comparable比較的例子:
class Person implements Comparable<Person>{
@Override
public int compareTo(Person person) {
return name.compareTo(person.name);
//return this.name - person.name;
}
}
ArrayList<Person> list = new ArrayList<Person>();
// 添加對象到ArrayList中
list.add(new Person("aaa", 10));
list.add(new Person("bbb", 20));
list.add(new Person("ccc", 30));
list.add(new Person("ddd", 40));
Collections.sort(list); //這里會自動調用Person中重寫的compareTo方法。
使用Comparator比較的例子:
public class ComparatorDemo {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Joe", 24),
new Person("Pete", 18),
new Person("Chris", 21)
);
Collections.sort(people, new LexicographicComparator());
System.out.println(people);
//[{name=Chris, age=21}, {name=Joe, age=24}, {name=Pete, age=18}]
Collections.sort(people, new Comparator<Person>() {
@Override
public int compare(Person a, Person b) {
// TODO Auto-generated method stub
return a.age < b.age ? -1 : a.age == b.age ? 0 : 1;
}
});
System.out.println(people);
//[{name=Pete, age=18}, {name=Chris, age=21}, {name=Joe, age=24}]
}
}
class LexicographicComparator implements Comparator<Person> {
@Override
public int compare(Person a, Person b) {
return a.name.compareToIgnoreCase(b.name);
}
}
class Person {
String name;
int age;
Person(String n, int a) {
name = n;
age = a;
}
@Override
public String toString() {
return String.format("{name=%s, age=%d}", name, age);
}
}
可以通過兩種方式去實現自定義排序:
第一種:
定義一個類去實現Comparator
接口,重寫其中的compare
方法。
第二種:
其實只是語法不同,在內部就new
這個接口并重寫里面的compare
方法。