Comparable和Comparator淺談
阿新 • • 發佈:2021-05-25
Comparable和Comparator
前言
Comparable是一個排序介面,若一個類實現了Comparable介面,就可以根據自己想要的排序,去重寫compareTo方法去實現
Comparator相當於一種通用的工具類介面。需要定製一個比較類去實現它,重寫compare方法去實現。
一、Comparable
定義一個簡單的學生類,來根據年齡大小來給學生排序
public class Test2 {
public static void main(String[] args) {
Person[ ] people= {
new Person("YY",18),
new Person("LY",21),
new Person("MY",19)};
Arrays.sort(people);
System.out.println(Arrays.toString(people));
}
}
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) {
return this.age-o.age;
}
@Override
public String toString() {
return "name :"+name+","+"age :"+age;
}
}
重寫compareTo方法,通過當前物件和引數的比較
二者相等是 return 0;
當前物件比引數大時 return 1;
當前物件比引數小時 return -1;
Comparable是排序介面;若一個類實現了Comparable介面,就意味著”該類支援排序。
最後根據自己的需求,重寫compareTo方法就好了。
二、Comparator
import java.util.*;
//定義一個學生類 有姓名,年齡,性別
public class Person4 {
private String name;
private int age;
private String sex;
public Person4(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "name:"+name+","+"age:"+age+","+"sex:"+sex;
}
}
//實現了Comparator 介面 重寫compare方法
class Person4Comparator implements Comparator<Person4> {
@Override
public int compare(Person4 o1, Person4 o2) {
return o1.getAge()-o2.getAge();
}
}
//測試類
class test{
public static void main(String[] args) {
List<Person4> list=new ArrayList<>();
Person4 p1=new Person4("YY",18,"nv");
Person4 p2=new Person4("LY",21,"nan");
Person4 p3=new Person4("XY",22,"nv");
list.add(p1);
list.add(p2);
list.add(p3);
//定義一個比較器
Person4Comparator comparator=new Person4Comparator();
Collections.sort(list,comparator);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
三、區別
Comparable 是 java.lang.包下的 Comparator是java.util.包下的
Comparable是需要比較的物件來實現介面,需要改變物件的內部結構,破壞性大。
Comparator是一種通用的比較工具類介面,物件不需要做任何改變,只需要為需要比較類,量身定製一個比較器即可,比較靈活。
實際的使用中,如果希望一個類的比較方式有很多種,而且比較方式具有外部擴充套件性,那麼可以實現Comparator介面,如果一個類預設的實現了Comparable介面,而你又希望再定義一個比較規則,那麼你不可能去修改原類,因為這樣會破壞封閉開放原則,最好的方法是寫一個實現了Comparator介面的類。總的來說,Comparator介面比Comparable介面要靈活。