Comparable和Comparator两接口的区别

comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序

Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口

具体例子:

public class UserInfo implements Comparable<UserInfo> {

    private int id;
    private String name;
    private int age;
    public UserInfo(int id, String name, int age) {

        this.id = id;
        this.name = name;
        this.age = age;

    }

    @Override
    public int compareTo(@NonNull UserInfo o) {
        return age > o.age ? 1 : (age == o.age ? 0 : -1);

    }

    @Override
    public String toString() {
        return "UserInfo[id=" + id + " name=" + name + " age=" + age + "]";
    }

}
    @Test
    public void java8Test(){
        List<UserInfo> userInfoList = new ArrayList<>();

        userInfoList.add(new UserInfo(0, "大强", 12));
        userInfoList.add(new UserInfo(1, "大黄", 18));
        userInfoList.add(new UserInfo(2, "大黑", 16));
        userInfoList.add(new UserInfo(0, "大白", 52));
        userInfoList.add(new UserInfo(0, "大红", 8));
        userInfoList.add(new UserInfo(0, "大花", 16));
        userInfoList.add(new UserInfo(0, "大菜", 36));
        
        System.out.println("排序前");
        for (UserInfo userInfo : userInfoList) {
            System.out.println(userInfo);
        }

        Collections.sort(userInfoList);
        System.out.println("排序后");
        for (UserInfo userInfo : userInfoList) {
            System.out.println(userInfo);
        }

    }

 

 

 

Comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序

Comparator可以说是一个外比较器,个人认为有两种情况:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式(如:让人根据年龄排序,如果年龄一样,,根据姓名的自然顺序排序)

具体例子:

public class UserB {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public UserB(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;

    }

    @Override
    public String toString() {
        return "userB[id=" + id + " name=" + name + " age=" + age + "]";
    }
}
@Test
    public void java8Test(){
      
        List<UserB> userList = new ArrayList<>();
        userList.add(new UserB(0, "dog", 12));
        userList.add(new UserB(1, "dog", 18));
        userList.add(new UserB(2, "dog", 16));
        userList.add(new UserB(0, "baby", 52));
        userList.add(new UserB(0, "girl", 8));
        userList.add(new UserB(0, "egg", 16));
        userList.add(new UserB(0, "egg", 36));

        System.out.println("排序前");

        for (UserB userB : userList) {
            System.out.println(userB);
        }

        Collections.sort(userList, new Comparator<UserB>() {
            @Override
            public int compare(UserB o1, UserB o2) {
                if (o1.getName().compareTo(o2.getName()) == 0) {
                    if (o1.getAge() == o2.getAge()) {
                        return 0;
                    } else if (o1.getAge() > o2.getAge()) {
                        return 1;
                    } else {
                        return -1;
                    }
                } else if (o1.getName().compareTo(o2.getName()) > 0) {
                    return 1;
                } else {
                    return -1;
                }
            }


        });

        System.out.println("排序后");
        for (UserB userB : userList) {
            System.out.println(userB);
        }

    }

 

 

总结:

 ComparatableComparator
所在包
java.lang
java.util
使用场景让集合元素自身具备比较性,让元素实现comparable接口,覆盖comparaeTo(T o)方法当这个对象不支持自比较或者自比较函数不能满足你的要求
代码

Collections.sort(某个实现了Comparatable接口的对象集合)

Collections.sort(userInfoList);
Collections.sort(userList, new Comparator<UserB>() {

*****

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值