美文网首页
Comparator 和 Comparable的区别

Comparator 和 Comparable的区别

作者: shengjk1 | 来源:发表于2020-02-26 22:26 被阅读0次

    1.位置
    Comparable 位于 java.lang,我们都知道 java.lang包可以说是 java体系中基础包,有 ClassLoader、Class、Object、基本类型等
    Comparator 位于 java.util,也就是 java 自带的类库,包括一些常用的集合类、strem、function

    所以从这个角度来说,Comparator 也属于类库的一种就是为了方便开发,而 Comparable 就很重要了,整个 java 体系中的基础类而不是仅仅为了开发方便。

    2.描述
    Comparable: This interface imposes a total ordering on the objects of each class that implements it.
    可以通过 Collections.sort()、Arrays.sort() 方法进行排序,若某对象实现了 Comparable 则该对象的 SortedMap 、SortSet 会自动对对象进行排序,并不需要 Comparator 对其进行手动排序。

    Comparator: A comparison function, which imposes a total ordering on some collection of objects.
    Comparator可以对非已经排好序的进行排序,而且还可以对已经有顺序的SortedMap、SortSet 进行排序。

    3.使用

    public class ComparatorTextList {
        public static void main(String[] args) {
            List<User> userlist = new ArrayList<User>();
            User user1 = new User("Y - 易小星 ", 31);
            User user2 = new User("W - 王大锤", 33);
            userlist.add(user1);
            userlist.add(user2);
            //更偏向于对一系列的对象,需要手动对对象进行排序
            Comparator<User> cmp = new ComparatorUser();
            Collections.sort(userlist, cmp);
            for (User user : userlist) {
                System.out.println(user.getName());
            }
            
            System.out.println("hsahSet=====");
            HashSet<User> users = new HashSet<>();
            users.add(user1);
            users.add(user2);
            for (User user : users) {
                System.out.println(user.getName());
            }
            System.out.println("treeSet=====");
    
            //实现了 Comparable 接口,对于有序集合是自动排序的。但让也可以通过 Comparator 对其进行排序
            TreeSet<User> treeSet = new TreeSet<>();
            treeSet.addAll(users);
            for (User user : treeSet) {
                System.out.println(user.getName());
            }
            //实现了 Comparable 接口,它可以与相应的类对象进行比较
            System.out.println(user2.compareTo(user1));
        }
    }
    
    //也需要遵循 the general contract,建议实现 Serializable 接口
    class ComparatorUser implements Comparator<User> {
        @Override
        public int compare(User u1, User u2) {
            // 先按年龄排序
            int flag = u1.getAge().compareTo(u2.getAge());
            // 年龄相等比较姓名
            if (flag == 0) {
                return u1.getName().compareTo(u2.getName());
            } else {
                return flag;
            }
        }
    }
    
    class User implements Comparable<User> {
        private String name;
        private Integer age;
        
        public User() {
            super();
        }
        
        public User(String name, Integer age) {
            super();
            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 int compareTo(@NotNull User user) {
            // 先按年龄排序
            int flag = this.age.compareTo(user.getAge());
            // 年龄相等比较姓名
            if (flag == 0) {
                return this.getName().compareTo(user.getName());
            } else {
                return flag;
            }
        }
        
        //最好是重写一下 equals 方法,防止两个类对象相同而 equals 不同,不满足 Object 的约束
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            User user = (User) o;
            return Objects.equals(name, user.name) &&
                    Objects.equals(age, user.age);
        }
        
        //同理的,重写 equals 方法,一般都需要重写 hashCode 方法,这样才能保证,equals 相等的两个对象的 hashCode 也相同,
        // 满足 Object 约束
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    }
    

    相关文章

      网友评论

          本文标题:Comparator 和 Comparable的区别

          本文链接:https://www.haomeiwen.com/subject/ehpgchtx.html