欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Comparable和Comparator两接口的区别

程序员文章站 2022-03-10 16:05:55
...

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

Comparable和Comparator两接口的区别

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);
        }

    }

Comparable和Comparator两接口的区别

 

 

 

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

Comparable和Comparator两接口的区别

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);
        }

    }

Comparable和Comparator两接口的区别

 

 

总结:

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

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

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

*****

}

 

相关标签: JAVA