1.相同点:
它们两个都是接口,都可以进行排序
2.不同点:
(1)接口里的抽象方法不同
Compareable—>int compareTo( T o );
Comparator-----> int compare(T o1,T o2);
(2)应用方式不同
(1)如果一个类想要通过Compareable方式排序,那要求这个类必须实现Compareable接口,并重写这个类的compareTo方法,那后面不管到哪,该类的对象都可以按照这个排序规则进行排序
jdk自带的类大都实现了这个接口,例如Integer,String等数据类型,所以当我们把数据存进TreeSet集合中,可以实现自动排序,它底层依赖的就是Compareable接口,我们把这种排序方式称为自然排序
源码展示:
Integer
public final class Integer extends Number implements Comparable<Integer>{
//重写compareTo方法
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
}
如果是我们自定义的类,例如student类,如果想要通过自己定义的排序规则,那也必须实现这个规则,这样创建对象后,可以调用利用对象1.compareTo(对象2)的方式来对二者进行比较大小
(2)当jdk实现的Compareable排序规则不再满足我们的需要时,这是可以采用new Comparator实现类的方法,让实现类重写里面的compare方法,重新定义排序规则,此时我们称作是比较器排序,那此时就可以利用这个实现类的对象.compare(对象1,对象2)的方式,对两个对象进行排序.