Comparable和Comparator的区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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);
}
假设我们通过 pareTo(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) {
= name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Girl(String name, int age) {
super();
= 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);
}
总结
1. java中8⼤基本类型都实现了Comparable接⼝,如果没有实现Comparable接⼝的类想排序或者已实现Comparable接⼝的类想修改排
序,可以使⽤Comparator接⼝,Comparator相当于是对Comparable的⼀种扩展和补充。

2. Comparator是对排序的解耦,它可以灵活的修改排序规则,⽽不⽤修改待排序的类。

相关文档
最新文档