1. 程式人生 > 實用技巧 >Java中Comparable和Comparator的區別

Java中Comparable和Comparator的區別

Comparable:

Comparable定義在java.lang包裡,意味著可以被比較的能力,因此某個類想要可以被排序,被比較大小,需要實現這個介面

public interface Comparable<T> {
    public int compareTo(T o);
}

Comparable測試程式碼:

  • 1、實現Comparable介面的Girl類
package comparabletest;
public class Girl  implements Comparable<Girl>{

    private String name;
    private  int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Girl(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 重寫方法,自定義排序的策略
     * @param o
     * @return
     */
    @Override
    public int compareTo(Girl o) {
        return this.age -o.age;
    }

    @Override
    public String toString() {
        return "Girl{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



  • 2、測試類
package comparabletest;
public class TestGirl {

    public static void main(String[] args) {

        Girl girl1 = new Girl("A", 20);
        Girl girl2 = new Girl("B", 15);
        System.out.println(girl1.compareTo(girl2));
    }
}

Comparator:

Comparator定義在java.util包中,代表著一個角色,這個角色的功能是對傳入的兩個元素進行大小的比較,並且返回結果.

public interface Comparator<T> {
    int compare(T o1, T o2);   
}

Comparator 測試程式碼:

  • 1、正常的Girl類
package comparatortest;
public class Girl {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Girl(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Girl [name=" + name + ", age=" + age + "]";
    }

}
  • 2、實現外部的Comparator介面的類:
package comparatortest;
import java.util.Comparator;

public class GirlComparator implements Comparator<Girl> {


    /**
     * 重寫這個方法:自定義比較策略--年齡比較大的就比較大
     * @param o1
     * @param o2
     * @return 比價值 大於0:o1比o2大           小於0:o1比o2小
     */
    @Override
    public int compare(Girl o1, Girl o2) {
        return o1.getAge() - o2.getAge();
    }
}
  • 3、測試類:
package comparatortest;
public class GirlTest {
    public static void main(String[] args) {

        Girl girl1 = new Girl("A", 20);
        Girl girl2 = new Girl("B", 15);
        GirlComparator girlComparator = new GirlComparator();
        int compare = girlComparator.compare(girl1, girl2);
        System.out.println(compare);
    }
}

Comparable和Comparator的主要區別在於:

  (1).Comparable和Comparator 和 都是Java中的內部比較器介面,都是用來實現對一個自定義的類進行排序

  (2). 不同的是實現Comparable介面是定義在類的內部,比較程式碼需要嵌入類的內部結構中

  (3). Comparator 實現在類的外部,單獨實現第一個比較器,不需要對原來的類進行結構上的變化,屬於無侵入式的。