Comparable与Comparator的区别
一、概述
首先Comparable和Comparator都是接口,都是可以用来实现集合的比较、排序,但是他们两个的本质区别就是,Comparable是将比较代码嵌入自身的类中,而Comparator即可以嵌入到自身类中,也可以在一个独立的类中完成。
Integer、String、Character等基本类型的封装类都已经实现了Comparable的接口,这些类对象本身就可以直接比较,直接调用Collections.sort()即可,无需自己实现Comparable接口。
而有些自定义类型,或者你想实现一种特殊的排列的时候,就需要一个比较器来完成两个对象之间的比较,也就是指定使用Comparator(临时规则排序,也称专门规则排序),如果不指定Comparator,那就用自然规则排序,在这里的自然规则排序就是实现Comparable接口设定的排序方式。
二、Comparable
Comparable可以认定为一个内比较器,实现了Comparable接口的类的一个特点,就是这些类可以与自己比较,至于具体的类一个实现了Comparable接口的类如何比较,则依赖于comparaTo方法的实现,comparaTo被称作为自然比较方法,如果开发者add进入一个Collection的对象想要调用Collection的sort方法来实现自动排序的话,那么必须实现Comparable接口,compareTo方法返回值是int,有三种情况:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数 2、比较者等于被比较者,那么返回0 3、比较者小于被比较者,那么返回负整数
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
class People implements Comparable{
private int age;
private String name;
public People(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Object o) {
People a =(People) o;
return a.age-this.age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name+" "+ age + " ";
}
}
public class Test {
public static void main(String[] args) {
ArrayList<People> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new People(i,i+""));
}
Collections.sort(list);
System.out.println(list);
}
}
三、Comparator
Comparator被认为是一个外比较器,它具有两种常用的方法,排序,比较相同与否
public interface Comparator<T> {
public int compare(T lhs, T rhs);
}
使用方式主要分为三步:
1、创建Comparator接口的实现类,并且赋值给一个对象
2、在compare方法中针对自定义的类写排序规则
3、将Comparator对象作为参数传递给排序类的某个方法
compare的比较方式与comparaTo类同
class Cmp implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
}
public class Test {
public static void main(String[] args) {
Integer[] arr = new Integer[10];
Cmp cmp = new Cmp();
for (int i = 0; i < 10; i++) {
arr[i]=i;
}
Arrays.sort(arr,new Cmp());
System.out.println(Arrays.toString(arr));
}
}
三、区别
Comparable 是对象自身的排序方式,而 Comparator 是外部提供的排序规则。使用 Comparable 接口可以方便地使用对象的自然排序,而使用 Comparator 接口可以实现灵活多样的排序方式。
