Comparable 和 Comparator的区别
Comparable
Comparable 是排序接口。
- 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
- “实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
Comparable接口中定义了一个方法:
public interface Comparable<T> {
public int compareTo(T o);
}
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。
- 若返回“负数”,意味着“x比y小”;
- 返回“零”,意味着“x等于y”;
- 返回“正数”,意味着“x大于y”。
举例:
public class Girl implements Comparable<Object> {
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 + "]";
}
@Override
public int compareTo(Object o) {
Girl g = (Girl)o;
return this.age - g.getAge();
}
}
public static void main(String[] args) {
List<Girl> list = new ArrayList<>(100);
Girl girl;
for (int i=0; i<75; i++) {
girl = new Girl("girl " + i, i);
list.add(girl);
}
Collections.shuffle(list);
Collections.sort(list);
list.stream().forEach(System.out::println);
}
Comparator
Comparator 是比较器接口。
- 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
- 一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。同时使用时,Comparator的优先级高于Comparable。
Comparator接口中定义了两个方法:
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
compare返回值:
- 若返回“负数”,意味着“o1比o2小”;
- 返回“零”,意味着“o1等于o2”;
- 返回“正数”,意味着“o1大于o2”。
举例:
public class GirlComparator implements Comparator<Girl> {
@Override
public int compare(Girl g1, Girl g2) {
return g1.getAge() - g2.getAge();
}
}
public static void main(String[] args) {
List<Girl> list = new ArrayList<>(100);
Girl girl;
for (int i = 0; i< 75; i++) {
girl = new Girl("girl "+i, i);
list.add(girl);
}
Collections.sort(list,new GirlComparator());
list.stream().forEach(System.out::println);
}
总结
- java中8大基本类型都实现了Comparable接口,如果没有实现Comparable接口的类想排序或者已实现Comparable接口的类想修改排序,可以使用Comparator接口,Comparator相当于是对Comparable的一种扩展和补充。
- Comparator是对排序的解耦,它可以灵活的修改排序规则,而不用修改待排序的类。

浙公网安备 33010602011771号