面试官:元素排序Comparable和Comparator有什么区别?

Comparable比较器的使用

public class ComparableUser implements Comparable{
    private String id;//主键
    private int age;//年龄
    public ComparableUser(String id,int age) {
        this.id = id;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public int compareTo(Object o) {
        //使用年龄比较
        return this.age - ((ComparableUser)o).getAge();
    }

    public static void main(String[] args) {
        ComparableUser user1 = new ComparableUser("1",20);
        ComparableUser user2 = new ComparableUser("2",18);
        if(user1.compareTo(user2) > 0){
            System.out.println("年龄:用户1大于用户2");
        }else if(user1.compareTo(user2) < 0){
            System.out.println("年龄:用户1小于拥护2");
        }else{
            System.out.println("年龄:用户1等于用户2");
        }
    }
}

Comparator比较器的使用

import java.util.Comparator;

public class User {
    private String id;//主键
    private int age;//年龄
    public User(String id,int age) {
        this.id = id;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public static void main(String[] args) {
        User user1 = new User("1", 20);
        User user2 = new User("1", 18);
        Comparator comp = new UserComparator();//生成比较器
        int ret = comp.compare(user1,user2);
        if(ret > 0){
            System.out.println("用户1的年龄大于用户2");
        } else if(ret < 0) {
            System.out.println("用户1的年龄小于用户2");
        } else {
            System.out.println("用户1的年龄等于用户2");
        }
    }
}

//外比较器  一般命名风格为 要比较的对象+Comparator
class UserComparator implements Comparator{

    @Override//通过年龄比较
    public int compare(Object age1, Object age2) {
        User user1 = (User)age1;//类型转换
        User user2 = (User)age2;
        return user1.getAge() - user2.getAge();//结果
    }
}

Comparable和Comparator的区别

  • 如果一个集合元素的类型是可以比较的 那就说明他实现了Comparable接口,有了默认的排序方法,如果不能比较,则没有实现,这时候可以使用比较器来实现动态排序。

  • Comparator适用于: 一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

区别:

  1. Comparable是内比较器 是在类中实现的 要比较的类作为了实现类(需要比较的类作为实现类)。

  2. Comparator是外比较器 是在外部写一个专门的实现类来进行比较对象的(单独写一个类实现接口,作为实现类)。

  3. Comparable中的compareto方法 中有一个参数,相比 Comparator中的compare方法的两个参数,
    前者可以比较不同的对象(this.对象名.compareto(另一个对象)), 后者只能比较两个相同的对象。

  4. Comparable的compareto方法耦合性高于Comparator的compare()方法,因为Comparable要修改算法的话是在Compareble接口的实现类(需要比较的类作为实现类)中修改的,而Comparator的修改算法实在外部的实现类中完成的。

  5. Comparator接口更加灵活
    因为是外比较器,所以可以定义某个类的多个外比较器,在排序的时候根据需要调用多个比较器,而Comparable接口是内比较器,对这个需要比较的类来说,只能实现一个内比较器。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keild

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值