Java之Comparable與Comparator的區別

一、概述

Comparable和Comparator都是用來實現集合中元素的比較、排序的。
Comparable是在集合內部定義的方法實現的排序,位於java.lang下。
Comparator是在集合外部實現的排序,位於java.util下。

Comparable是一個對象本身就已經支持自比較所需要實現的接口,如String、Integer自己就實現了Comparable接口,可完成比較大小操作。自定義類要在加入list容器中後能夠排序,也可以實現Comparable接口,在用Collections類的sort方法排序時若不指定Comparator,那就以自然順序排序。所謂自然順序就是實現Comparable接口設定的排序方式。

Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足要求時,可寫一個比較器來完成兩個對象之間大小的比較。Comparator體現了一種策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行爲。

總而言之Comparable是自已完成比較,Comparator是外部程序實現比較。

二、Demo說明

Comparator


public class AbsComparator<T> implements Comparator<T>{

public int compare(Object o1, Object o2){
int ovalue1 = Math.abs(((Integer) o1).intValue());
int ovalue2 = Math.abs(((Integer) o2).intValue());
return (ovalue1 > ovalue2) ? 1 : (ovalue1 == ovalue2 ? 0 : -1);
    }
}




import java.util.Arrays;
import java.util.Random;

public class AbsComparatorTest{
public static void main(String[] args){
// 使用方法1
Random rn = new Random();
Integer[] integerArray = new Integer[20];
for (int i = 0; i < integerArray.length; i++)
    {
    integerArray[i] = new Integer(rn.nextInt(100) * (rn.nextBoolean() ? 1 : -1));
    }
System.out.println("用Integer內置方法排序:");
Arrays.sort(integerArray);
System.out.println(Arrays.asList(integerArray));
System.out.println("用AbsComparator排序:");
Arrays.sort(integerArray, new AbsComparator<Integer>());
System.out.println(Arrays.asList(integerArray));

// 使用方法2
System.out.println("用AbsComparator比較-100和10的絕對值大小結果是:");
AbsComparator<Integer> absComparator = new AbsComparator<Integer>();
int result = absComparator.compare(new Integer(-100), new Integer(10));
System.out.println(result);
    }
}

Comparable

 class TestAge implements Comparable<Object>{

         private int age;

         public TestAge(int age){
             this.age=age;
         }
         @Override
         public int compareTo(Object o) {
              return this.age -((TestAge)o).age ;
         }

     }

三、總結

可以看出Comparator爲一個比較器,而Comparable爲一個比較接口。
一個類實現了Camparable接口則表明這個類的對象之間是可以相互比較的,這個類對象組成的集合就可以直接使用sort方法排序。
Comparator可以看成一種算法的實現,將算法和數據分離,Comparator也可以在下面兩種環境下使用:
1、類的設計師沒有考慮到比較問題而沒有實現Comparable,可以通過Comparator來實現排序而不必改變對象本身
2、可以使用多種排序標準,比如升序、降序等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章