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 {
    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 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 {
    public int compare(T lhs, T rhs);
}

使用方式主要分为三步:

1、创建Comparator接口的实现类,并且赋值给一个对象

2、在compare方法中针对自定义的类写排序规则

3、将Comparator对象作为参数传递给排序类的某个方法

compare的比较方式与comparaTo类同

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

你可能感兴趣的:(java)