Comparable、Comparator接口区别

在Java中,若想实现自定义类的比较,提供了以下两个接口:
1、 java.lang.Comparable接口(内部比较器):
若一个类实现了Comparable接口,就意味着该类支持排序;
并且存放该类的Collection或数组,可以直接通过Collections.sort()或Arrays.sort进行排序;
实现了Comparable接口的类可以直接存放在TreeSet或TreeMap中。
public int compareTo(T o);
返回值三种情况:
返回正数:表示当前对象大于目标对象
返回0:表示当前对象等于目标对象
返回负数:表示当前对象小于目标对象

class Person1 implements Comparable<Person1> {//实现Comparable接口

    private String name;
    private Integer age;

    public Person1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public int compareTo(Person1 o) {//  覆写该方法    先比较年龄再比较名字  
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        } else {
            return this.name.compareTo(o.name);//否则比较name
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Set<Person1> set = new TreeSet<>();
        set.add(new Person1("张三", 20));
        set.add(new Person1("李四", 14));
        set.add(new Person1("李四", 14));
        System.out.println(set);
    }
}

2、 Comparator(外部排序接口):
若要控制某个自定义类的顺序,而该类本身不支持排序(类本身没有实现Comparator接口),我们可以建立一个该类的“比较器”来进行排序。
比较器实现Comparator接口即可。
“比较器”:实现了Comparator接口的类作为比较器,通过该比较器来进行类的排序。
int compare(T o1,T o2);
返回值与compareTo返回值完全一样
返回正数:o1>o2
返回0:o1=o2
返回负数:o1<o2

class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class AscAgeComparator implements Comparator<Person>{//equals()方法,Object类已经帮助该类实现了
    //Person的比较器
    //升序
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();//升序
    }
}
class DescAgeComparator implements Comparator<Person>{//equals()方法,Object类已经帮助该类实现了
  
    //降序
    @Override
    public int compare(Person o1, Person o2) {
        return o2.getAge()-o1.getAge();//降序
    }
}
public class Test {
    public static void main(String[] args) {

        Set<Person> set = new TreeSet<>(new AscAgeComparator());//传入一个Comparator接口 升序
        // Set<Person> set = new TreeSet<>(new DescAgeComparator());//降序
        set.add(new Person("张三", 20));
        set.add(new Person("李四", 14));

        System.out.println(set);
    }
}

实现了Comparator接口的的第三方排序-策略排序,此方法更加灵活,可以轻松改变策略进行第三方的排序算法。
1、Comparable是排序接口,若实现了Comparable接口,意味着该类支持排序,是一个内部比较器(自己去和别人比)
2、Comparator接口是比较器接口,类本身不支持排序,专门有若干个第三方的比较器(实现了Comparator接口的类)来进行类的排序,是一个外部比较器(策略模式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值