Java中Comparable和Comparator區別

1、Comparable簡介

  Comparable是排序接口。若一個類實現了Comparable接口,就意味着該類支持排序。實現了Comparable接口的類的對象的列表或數組能夠經過Collections.sort或Arrays.sort進行自動排序。html

  此外,實現此接口的對象能夠用做有序映射中的鍵或有序集合中的集合,無需指定比較器。該接口定義以下:java

package java.lang;
import java.util.*;
public interface Comparable<T> 
{     public int compareTo(T o); }

  T表示能夠與此對象進行比較的那些對象的類型。數組

  此接口只有一個方法compare,比較此對象與指定對象的順序,若是該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。ide

  如今咱們假設一個Person類,代碼以下:函數

複製代碼
public class Person
{
    String name;
    int age;
    public Person(String name, int age)
    {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName()
    {
        return name;
    }
  public int getAge() { return age; } }
複製代碼

  如今有兩個Person類的對象,咱們如何來比較兩者的大小呢?咱們能夠經過讓Person實現Comparable接口:this

複製代碼
public class Person implements Comparable<Person>
{
    String name;
    int age;
    public Person(String name, int age)
    {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
    @Override
    public int compareTo(Person p)
    {
        return this.age-p.getAge();
    }
    public static void main(String[] args)
    {
        Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)};
        System.out.println("排序前");
        for (Person person : people)
        {
            System.out.print(person.getName()+":"+person.getAge());
        }
        Arrays.sort(people);
        System.out.println("\n排序後");
        for (Person person : people)
        {
            System.out.print(person.getName()+":"+person.getAge());
        }
    }
}
複製代碼

  程序執行結果爲:spa

  

2、Comparator簡介

  Comparator是比較接口,咱們若是須要控制某個類的次序,而該類自己不支持排序(即沒有實現Comparable接口),那麼咱們就能夠創建一個「該類的比較器」來進行排序,這個「比較器」只須要實現Comparator接口便可。也就是說,咱們能夠經過實現Comparator來新建一個比較器,而後經過這個比較器對類進行排序。該接口定義以下:code

package java.util;
public interface Comparator<T>
 {
    int compare(T o1, T o2);
    boolean equals(Object obj);
 }

注意:一、若一個類要實現Comparator接口:它必定要實現compare(T o1, T o2) 函數,但能夠不實現 equals(Object obj) 函數。htm

   二、int compare(T o1, T o2) 是「比較o1和o2的大小」。返回「負數」,意味着「o1比o2小」;返回「零」,意味着「o1等於o2」;返回「正數」,意味着「o1大於o2」。對象

  如今假如上面的Person類沒有實現Comparable接口,該如何比較大小呢?咱們能夠新建一個類,讓其實現Comparator接口,從而構造一個「比較器"。

複製代碼
public class PersonCompartor implements Comparator<Person>
{
    @Override
    public int compare(Person o1, Person o2)
    {
        return o1.getAge()-o2.getAge();
    }
}
複製代碼

  如今咱們就能夠利用這個比較器來對其進行排序:

複製代碼
public class Person
{
    String name;
    int age;
    public Person(String name, int age)
    {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
    public static void main(String[] args)
    {
        Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)};
        System.out.println("排序前");
        for (Person person : people)
        {
            System.out.print(person.getName()+":"+person.getAge());
        }
        Arrays.sort(people,new PersonCompartor());
        System.out.println("\n排序後");
        for (Person person : people)
        {
            System.out.print(person.getName()+":"+person.getAge());
        }
    }
}
複製代碼

  程序運行結果爲:

  

3、Comparable和Comparator區別比較

  Comparable是排序接口,若一個類實現了Comparable接口,就意味着「該類支持排序」。而Comparator是比較器,咱們若須要控制某個類的次序,能夠創建一個「該類的比較器」來進行排序。

  Comparable至關於「內部比較器」,而Comparator至關於「外部比較器」。

  兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成爲一個能夠比較的對象,可是須要修改源代碼。 用Comparator 的好處是不須要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象須要做比較的時候,把比較器和對象一塊兒傳遞過去就能夠比大小了, 而且在Comparator 裏面用戶能夠本身實現複雜的能夠通用的邏輯,使其能夠匹配一些比較簡單的對象,那樣就能夠節省不少重複勞動了。

相關文章
相關標籤/搜索