Java比较器Comparable接口与Comparator接口的区别
Comparable:
内部比较器,一个类如果想要使用 Collections.sort(list) 方法进行排序,则需要实现该接口;
使用步骤:
创建一个类实现Comparable接口,并重写compareTo( ) 方法;
Comparator:
外部比较器,用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意的情况进行排序.无需改变类的结构,更加灵活;
使用步骤:
1.创建比较器子类;
2.重写compare( )方法,对参数进行操作;
3.在集合中引入比较器对象;
作用:
Comparable和Comparator两者都是用来实现集合中元素的比较、排序的;
这两个比较器的使用,都是需要通过 Collections.sort( ) 调用的。
使用方式:
Comparable接口
1.像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方式;
2.像String、包装类重写compareTo()方法以后,进行了从小到大的排列;
3.对于自定义类来说,如果需要排序,我们可以让自定义实现Comparable接口,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序;
4.重写compareTo(obj)的规则:
- 如果当前对象this大于形参对象obj,则返回正整数,那么当前对象向后排,达到升序效果;
- 如果当前对象this小于形参对象obj,则返回负整数,那么当前对象向后排,达到降序效果;
- 如果当前对象this等于形参对象obj,则返回零,那么表示两个对象相等,判定为重复数据;
实现Comparable接口案例:
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student o) {
return(this.age - o.age)
}
}
Comparator接口
1.当元素的类型没有实现java.lang.Comparator接口而又不方便修改代码或实现了java.lang.Comparator接口的排序规则不适当当前的操作时,那么可以考虑使用Comparator的对象排序;
2.重写compare(object o1,object o2)方法,比较o1和o2的大小:
- 如果o1大于o2,那么方法会返回正整数;
- 如果o1、o2相等,表示返回0;
- 如果o1小于o2,那么方法会返回负整数。
实现Comparator接口案例:
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
}
class NameComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.name.compareTo(o2.name);
}
}
区别:
区别 | Comparable | Comparator |
---|---|---|
所在包不同 | java.util.Comparable | java.lang.Comparator |
排序方法不同 | int comparaTo(Object o1) | int compare(Object o1,Object o2) |
排序逻辑不同 | 在待排序的类中实现 | 另定义一个类实现 |
比较方式不同 | 内部比较器 | 外部比较器 |
耦合性不同 | 强耦合 | 松耦合 |