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 接口可以实现灵活多样的排序方式。