• 集合排序Comparable和Comparator有什么区别?


    Comparable和Comparator兄弟俩长得是真像。但是,需要注意下,使用中它们还是有不少区别的。下面,就一探究竟吧。

    一、Comparator

    做过集合排序的童鞋应该知道,可以使用Collections.sort方法对集合进行排序。我们点进去Collections类源码里边,会发现sort有两个重载方法。一个只需传一个List参数,另一个需要传两个参数:List和Comparator。

    其实,这两种方法就对应了Comparable和Comparator的两种用法。我经常使用带两个参数的方法,即需要实现Comparator接口。

    使用步骤:

    1. 定义待比较的实体类。
    2. 定义一个比较器,实现Comparator接口。
    3. 重写compare方法。
    //待比较的实体类
    public class User{
        private int age;
        private String name;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public User(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public User() {
    
        }
    }
    //比较器,实现Comparator接口
    public class UserCompare implements Comparator<User> {
        @Override
        public int compare(User o1, User o2) {
            return o1.getAge() - o2.getAge();
        }
    }
    
    public class CmpTest {
        public static void main(String[] args) {
    
            User user1 = new User(20, "李四");
            User user2 = new User(18, "张三");
            User user3 = new User(23, "王五");
    
            ArrayList<User> userList = new ArrayList<>();
            userList.add(user1);
            userList.add(user2);
            userList.add(user3);
    
            System.out.println("排序前");
            for (User user : userList) {
                System.out.println(user.getAge()+":"+user.getName());
            }
            Collections.sort(userList, new UserCompare()); //把比较器传进去
            System.out.println("排序后");
            for (User user : userList) {
                System.out.println(user.getAge()+":"+user.getName());
            }
        }
    }
    

    打印结果如下:

    排序前
    20:李四
    18:张三
    23:王五
    排序后
    18:张三
    20:李四
    23:王五
    

    可以看到,已经实现了集合中User对象按年龄升序排序。

    二、Comparable

    这种方式,需要修改User类,实现Comparable接口,然后重写compareTo方法。

    public class User implements Comparable<User>{
        private int age;
        private String name;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public User(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public User() {
    
        }
    
        @Override
        public int compareTo(User o) {
            return this.getAge() - o.getAge();
        }
    }
    

    测试类中只需要修改一行代码

    //原来的代码
    Collections.sort(userList, new UserCompare()); 
    //替换为
    Collections.sort(userList);
    

    测试结果和上面是一模一样的。

    三、总结

    1. 它们出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
    2. Comparator 使用比较灵活,不需要修改实体类源码,但是需要实现一个比较器。
    3. Comparable 使用简单,但是对代码有侵入性,需要修改实体类源码。
  • 相关阅读:
    Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践
    001.Getting Started -- 【入门指南】
    SparkStreaming高级算子应用【combineByKey、transform,checkpoint】
    Solr基础理论【相关度计算】
    Solr基础理论【排名检索、查准率、查全率】
    Solr基础理论【倒排索引,模糊查询】
    Impala快速入门
    Redis特点分析及性能优化
    电力系统【第八章:电力系统不对称故障的分析与计算】
    SparkStreaming之checkpoint检查点
  • 原文地址:https://www.cnblogs.com/starry-skys/p/12157141.html
Copyright © 2020-2023  润新知