1. 程式人生 > 其它 >Comparator和Comparable的區別

Comparator和Comparable的區別

技術標籤: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);
	}
}
  1. 在實體類PersonModel2之外實現了Comparator介面的比較類SortPersonModel2,這個類和實體類是分開的,可以在需要的時候新增或移除,原來的類本身不受影響(靈活性的體現);
  2. TreeSet在例項化時需要將比較類的物件當作引數傳入,意思是TreeSet依照這個標準進行排序。