前言
1.Comparable 是排序接口,一个类实现了 Comparable接口,意味着“该类支持排序”。
2.Comparator 是比较器,我们可以实现该接口,自定义比较算法,创建一个 “该类的比较器” 来进行排序。Comparable 相当于“内部比较器”,而 Comparator 相当于“外部比较器”。
3.Comparable 的耦合性更强,Comparator 的灵活性和扩展性更优。4.Comparable 可以用作类的默认排序方法,而 Comparator 则用于默认排序不满足时,提供自定义排序。
1.comparable接口
comparable是需要比较的对象来实现该接口,一个类实现了comparable接口后需要重写compareTo(比较规则)方法
public int compareTo(Person o) {
if(this.age==o.age&&this.name==o.name){
return 0;
}else if(this.age>o.age){
System.out.println("this.age:"+this.age+"o.age:"+o.age);
return 1;
}else{
return -1;
}
}
通过外部调用来实现对内部对象的比较
list.add(new Person(66,"李四"));
list.add(new Person(34,"王五"));
list.add(new Person(45,"赵四"));
list.add(new Person(23,"麻子"));
Collections.sort(list);
list内部存放的是实现了comparable接口的Person的对象实例,对其进行比较排序。这样对象调用实现的方法来比较。对对象的耦合度高(需要改变对象的内部结构,破坏性大)。
2.comparator接口
comparator相当于一通用的比较工具类接口。需要定制一个比较类去实现它,重写里面的compare方法,方法的参数即是需要比较的对象。对象不用做任何改变,实现解耦。
Collections.sort(list,new Comparator<emp>(){
@Override
public int compare(emp o1, emp o2) {
if(o1.age==o2.age&&o1.name==o2.name){
return 0;
}else if(o1.age>o2.age){
return 1;
}else{
return 0;
}
}
});
list集合内部存放的是emp的对象实例
小案例
当实现类实现了 Comparable 接口,但是已有的 compareTo 方法的比较算法不满足当前需求,此时如果想对两个类进行比较,有两种办法:
1)修改实现类的源代码,修改 compareTo 方法,但是这明显不是一个好方案,因为这个实现类的默认比较算法可能已经在其他地方使用了,此时如果修改可能会造成影响,所以一般不会这么做。
2)实现 Comparator 接口,自定义一个比较器,该方案会更优,自定义的比较器只用于当前逻辑,其他已有的逻辑不受影响。