淺析Java中comparator介面與Comparable介面的區別_java

來源:互聯網
上載者:User

Comparable 簡介

Comparable 是排序介面。

若一個類實現了Comparable介面,就意味著“該類支援排序”。  即然實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的對象的List列表(或數組)”,則該List列表(或數組)可以通過 Collections.sort(或 Arrays.sort)進行排序。

此外,“實現Comparable介面的類的對象”可以用作“有序映射(如TreeMap)”中的鍵或“有序集合(TreeSet)”中的元素,而不需要指定比較子。

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<Person> { 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 裡面使用者可以自
己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重複勞動了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.