Comparator和Comparable的區別
阿新 • • 發佈:2021-01-12
技術標籤:java
一、Comparable介面
- 概念: 類一開始就實現了該介面,從字尾也能知道:able(可…的),意思是實現了這個介面的類是可比較的。
- 區別記憶: 內比較器
- 重寫方法:
public int compareTo(PersonModel1 o){}
- 程式碼分析:
public class PersonModel1 implements Comparable<PersonModel1>{
private int age;
private String name;
private String id;
public PersonModel1(int age) {
super();
this.age = age;
}
@Override
public int compareTo(PersonModel1 o) {
return this.age-((PersonModel1)o).age;
}
@Override
public String toString() {
return "[年齡:" + age + "]";
}
}
public class PersonTest {
public static void main(String[] args) {
PersonModel1 p1 = new PersonModel1(10);
PersonModel1 p2 = new PersonModel1(11);
PersonModel1 p3 = new PersonModel1(9);
TreeSet<PersonModel1> set1 = new TreeSet<PersonModel1>();
set1.add(p1);
set1.add(p2);
set1.add(p3);
System.out.println(set1);
}
}
這裡可以看出PersonModel1實現了Comparable介面,則在集合TreeSet中自動按照比較規則進行排序。
二、Comparator介面
- 概念: 比較器,是單獨於類之外的。相比較Comparable介面,Comparator的應用更為靈活。因為Comparable只是對實現了這個介面的類生效,而Comparator則可以普遍應用於所有類(只要根據類實現具體的比較方法即可。
- 區別記憶: 外比較器
- 重寫方法:
public int compare(E o1, E o2) {}
,E即為要比較的類 - 程式碼分析:
public class PersonModel2 {
private int age;
private String name;
private String id;
public PersonModel2(int age) {
super();
this.age = age;
}
public int getAge() {
return this.age;
}
@Override
public String toString() {
return "[age=" + age + "]";
}
}
class SortPersonModel2 implements Comparator<PersonModel2>{
@Override
public int compare(PersonModel2 o1, PersonModel2 o2) {
return o1.getAge()-o2.getAge();
}
}
public class PersonTest {
public static void main(String[] args) {
PersonModel2 p21 = new PersonModel2(10);
PersonModel2 p22 = new PersonModel2(11);
PersonModel2 p23 = new PersonModel2(9);
TreeSet<PersonModel2> set2 = new TreeSet<PersonModel2>(new SortPersonModel2());
set2.add(p21);
set2.add(p22);
set2.add(p23);
System.out.println(set2);
}
}
- 在實體類PersonModel2之外實現了Comparator介面的比較類SortPersonModel2,這個類和實體類是分開的,可以在需要的時候新增或移除,原來的類本身不受影響(靈活性的體現);
- TreeSet在例項化時需要將比較類的物件當作引數傳入,意思是TreeSet依照這個標準進行排序。