Comparable和Comparator的区别

Comparable接口
1
package java.lang; 2 import java.util.*; 3 public interface Comparable<T> { 4 public int compareTo(T o); 5 }
//Comparable对实现它的每个类的对象进行整体排序。这个接口需要类本身去实现(这句话没看懂?没关系,接下来看个例子就明白了)。
//若一个类实现了Comparable 接口,实现 Comparable 接口的类的对象的 List 列表 ( 或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
//此外,实现 Comparable 接口的类的对象 可以用作 “有序映射 ( 如 TreeMap)” 中的键或 “有序集合 (TreeSet)” 中的元素,而不需要指定比较器。
//compareTo方法的返回值是int,有三种情况:

1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

  2、比较者等于被比较者,那么返回0

  3、比较者小于被比较者,那么返回负整数

  写个很简单的例子:

 1 package collections;
 2 
 3 public class Person1 implements Comparable<Person1>
 4 {
 5     private int age;
 6     private String name;
 7 
 8     public Person1(String name, int age)
 9     {
10         this.name = name;
11         this.age = age;
12     }
13     @Override
14     public int compareTo(Person1 o)
15     {
16         return this.age-o.age;
17     }
18     @Override 
19     public String toString()
20     {
21         return name+":"+age;
22     }
23 }
View Code

注意一下,前面说实现Comparable接口的类是可以支持和自己比较的,但是其实代码里面Comparable的泛型未必就一定要是与当前类型一致,将泛型指定为String或者指定为其他任何任何类型都可以----只要开发者指定了具体的比较算法就行。

Comparator接口
1
package java.util; 2 public interface Comparator<T> { 3 int compare(T o1, T o2); 4 boolean equals(Object obj); 5 }

  //Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:

  //1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

  //2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式   

  //Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

  1、o1大于o2,返回正整数

  2、o1等于o2,返回0

  3、o1小于o3,返回负整数

 

 1 public class TestComparator implements Comparator<Test>
 2 {
 3     public int compare(Test domain1, Test domain2)
 4     {
 5         if (domain1.getStr().compareTo(domain2.getStr()) > 0)
 6             return 1;
 7         else if (domain1.getStr().compareTo(domain2.getStr()) == 0)
 8             return 0;
 9         else 
10             return -1;
11     }
12 }
View Code

当然因为泛型指定死了,所以实现Comparator接口的实现类只能是两个相同的对象(不能一个Test、一个String)进行比较了,因此实现Comparator接口的实现类一般都会以"待比较的实体类+Comparator"来命名

有时在实现Comparator接口时,并没有实现equals方法,可程序并没有报错,原因是实现该接口的类也是Object类的子类,而Object类已经实现了equals方法。

Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。 前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。 
我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”,Comparator 更像是算法与数据的分离

Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。Comparable是自已完成比较,Comparator是外部程序实现比较

 Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式

posted @ 2017-11-16 23:48  朱洪昌  阅读(245)  评论(0编辑  收藏  举报