Java Comparable及Comparator介面區別詳解
在實際應用中,我們往往有需要比較兩個自定義物件大小的地方。而這些自定義物件的比較,就不像簡單的整型資料那麼簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義物件進行比較的。所以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:就是一個比較器,像一個第三方,傳入兩個物件,讓比較器去判斷誰大誰小;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。