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 }
注意一下,前面说实现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 }
当然因为泛型指定死了,所以实现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接口设定的排序方式