1. 程式人生 > >Comparable介面和Comparator介面的區別(通俗版)

Comparable介面和Comparator介面的區別(通俗版)

概述
Comparable和Comparator都是用來實現集合中元素的比較、排序的。
Comparable是在集合內部定義的方法實現的排序,位於java.lang下。
Comparator是在集合外部實現的排序,位於java.util下。

Comparable是一個物件本身就已經支援自比較所需要實現的介面,如String、Integer自己就實現了Comparable介面,可完成比較大小操作。自定義類要在加入list容器中後能夠排序,也可以實現Comparable介面,在用Collections類的sort方法排序時若不指定Comparator,那就以自然順序排序。所謂自然順序就是實現Comparable介面設定的排序方式。


Comparator是一個專用的比較器,當這個物件不支援自比較或者自比較函式不能滿足要求時,可寫一個比較器來完成兩個物件之間大小的比較。Comparator體現了一種策略模式(strategy design pattern),就是不改變物件自身,而用一個策略物件(strategy object)來改變它的行為。

總而言之Comparable是自已完成比較,Comparator是外部程式實現比較。
1. Comparator 和 Comparable 相同的地方

他們都是java的一個介面, 並且是用來對自定義的class比較大小的,

什麼是自定義class: 如 public class Person{ String name; int age }.

當我們有這麼一個personList,裡面包含了person1, person2, persion3....., 我們用Collections.sort( personList ), 
是得不到預期的結果的. 這時肯定有人要問, 那為什麼可以排序一個字串list呢:

如 StringList{"hello1" , "hello3" , "hello2"}, Collections.sort( stringList ) 能夠得到正確的排序, 那是因為 
String 這個物件已經幫我們實現了 Comparable介面 , 所以我們的 Person 如果想排序, 也要實現一個比較器。
   
2. Comparator 和 Comparable 的區別
Comparable Comparable 定義在 Person類的內部: public class Persion implements Comparable {..比較Person的大小..}, 因為已經實現了比較器,那麼我們的Person現在是一個可以比較大小的物件了,它的比較功能和String完全一樣,可以隨時隨地的拿來 比較大小,因為Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。 Comparator Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化,如 public class Person{ String name; int age }, 然後我們另外定義一個比較器: public PersonComparator implements Comparator() {..比較Person的大小..}, 在PersonComparator裡面實現了怎麼比較兩個Person的大小. 所以,用這種方法,當我們要對一個 personList進行排序的時候, 我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因為怎麼比較Person的大小是在PersonComparator 裡面實現的, 如: Collections.sort( personList , new PersonComparator() ). 3. Comparator 和 Comparable 的例項
Comparable: 實現Comparable介面要覆蓋compareTo方法, 在compareTo方法裡面實現比較: public class Person implements Comparable { String name; int age public int compareTo(Person another) { int i = 0; i = name.compareTo(another.name); // 使用字串的比較 if(i == 0) { // 如果名字一樣,比較年齡, 返回比較年齡結果 return age - another.age; } else { return i; // 名字不一樣, 返回比較名字的結果. } } } 這時我們可以直接用 Collections.sort( personList ) 對其排序了. Comparator: 實現Comparator需要覆蓋 compare 方法: public class Person{ String name; int age } class PersonComparator implements Comparator { public int compare(Person one, Person another) { int i = 0; i = one.name.compareTo(another.name); // 使用字串的比較 if(i == 0) { // 如果名字一樣,比較年齡,返回比較年齡結果 return one.age - another.age; } else { return i; // 名字不一樣, 返回比較名字的結果. } } } Collections.sort( personList , new PersonComparator()) 可以對其排序 4:總結 兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 介面的物件直接就成為一個可以比較的物件, 但是需要修改原始碼, 用Comparator 的好處是不需要修改原始碼, 而是另外實現一個比較器, 當某個自定義 的物件需要作比較的時候,把比較器和物件一起傳遞過去就可以比大小了, 並且在Comparator 裡面使用者可以自 己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的物件,那樣就可以節省很多重複勞動了。