程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 淺析Java中comparator接口與Comparable接口的差別

淺析Java中comparator接口與Comparable接口的差別

編輯:關於JAVA

淺析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 外面用戶可以自
己完成龐雜的可以通用的邏輯,使其可以婚配一些比擬簡略的對象,那樣便可以節儉許多反復休息了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved