Comparable接口和Comparator接口的區別


參考自:https://baijiahao.baidu.com/s?id=1652248417256209703&wfr=spider&for=pc  如果覺得寫的不好的話可以過去看一看這個文章;

       在實際應用中,我們往往有需要比較兩個自定義對象大小的地方。而這些自定義對象的比較,就不像簡單的整型數據那么簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義對象進行比較的。所以Java中要比較對象的大小或者要對對象的集合進行排序,需要通過比較這些對象的某些屬性的大小來確定它們之間的大小關系。

        一般,Java中通過接口實現兩個對象的比較,比較常用就是Comparable接口和Comparator接口。首先類要實現接口,並且使用泛型規定要進行比較的對象所屬的類,然后類實現了接口后,還需要實現接口定義的比較方法(compareTo方法或者compare方法),在這些方法中傳入需要比較大小的另一個對象,通過選定的成員變量與之比較,如果大於則返回1,小於返回-1,相等返回0。

 

一般簡單的回答可以這么說:

1)首先這兩個接口一般都是用來實現集合內的排序,comparable還可以用於兩個對象大小的比較。

2)Comparable接口在java.lang包下面。里面有一個compareTo(T)接口方法。當一個類需要比較的時候,需自行實現Comparable接口的CompareTo方法。當調用集合排序方法的時候,就會調用對象的compareTo()方法來實現對象的比較。

3)Comparator接口在java.util包下面。Comparator是一個比較器接口,一般單獨定義一個比較器實現該接口中的比較方法compare();在集合sort方法中傳入對應的比較器實現類。一般使用匿名內部類來實現比較器。

4)Comparator相對於Comparable來說更加的靈活,耦合度低。

 

首先呢,我們可以先了解一下List是如何排序的,我通過寫一個例子來說明;

先寫一個實體類;

public class User {
    private String name;
    private Integer age;
    public static void main(String[] args) {
        List<User> users=new ArrayList<>();
        users.add(new User("yao",19));
        users.add(new User("zhang",20));
        users.add(new User("li",17));
        users.add(new User("xu",15));
        users.add(new User("xupeng",15));
        users.sort(new UserComparator());
        System.out.println(users);
    }
    public User(){

    }
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

再寫一個實現比較器接口的類方法;

/**
 * 實現比較器接口,並重寫compare方法
 */
public class UserComparator implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        int age=o1.getAge()- o2.getAge();
        return age!=0?age:o1.getName().length()-o2.getName().length();
    }
}

最后,我們的測試結果是這樣的,說明成功了;

 

一、Comparable接口

1)什么是Comparable接口:

此接口強行對實現它的每個類的對象進行整體排序。此排序被稱為該類的自然排序 ,類的 compareTo方法被稱為它的自然比較方法 。實現此接口的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort )進行自動排序。實現此接口的對象可以用作有序映射表中的鍵或有序集合中的元素,無需指定比較器。

2)實現什么方法:

int compareTo(T o)

比較此對象與指定對象的順序。如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。

參數: o - 要比較的對象。

返回:負整數、零或正整數,根據此對象是小於、等於還是大於指定對象。

拋出:ClassCastException - 如果指定對象的類型不允許它與此對象進行比較。

3)實例(注:代碼基本上只改動我圈出來的即可測試,其它的照List排序的元代碼使用即可測試出結果):

當前對象 this與傳入的其他對應的比較方法時;

 

二、Comparator接口

1)實例說明:

Comparator接口與Comparable接口不同的是:

①Comparator位於包java.util下,而Comparable位於包java.lang下。

②Comparable接口將比較代碼嵌入需要進行比較的類的自身代碼中,而Comparator接口在一個獨立的類中實現比較。

③comparator接口相對更靈活些,因為它跟接口實現的類是耦合在一起的,可以通過換比較器來換不同的規則進行比較,即如果前期類的設計沒有考慮到類的Compare問題而沒有實現Comparable接口,后期可

   以通Comparator接口來實現比較算法進行排序,並且為了使用不同的排序標准做准備,比如:升序、降序。

④Comparable接口強制進行自然排序,而Comparator接口不強制進行自然排序,可以指定排序順序。

⑤換一種說法,簡單的說:

Comparable:使user類具有自比較的能力,可以讓自己跟同類型的數據做比較;

Comparator:就是一個比較器,像一個第三方,傳入兩個對象,讓比較器去判斷誰大誰小;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM