淺析Java中comparator接口與Comparable接口的差別。本站提示廣大學習愛好者:(淺析Java中comparator接口與Comparable接口的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析Java中comparator接口與Comparable接口的差別正文
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 外面用戶可以自
己完成龐雜的可以通用的邏輯,使其可以婚配一些比擬簡略的對象,那樣便可以節儉許多反復休息了。