Comparator和Comparable的区别

简介

在Java中,Comparable与Comparator两个接口都是用来做比较的。

Java环境:JDK1.8

 

Comparable

Comparable接口就是用于给类提供默认比较功能的。

Comparable可以认为是一个内比较器,很多类都会实现这个接口以提供对该类对象之间比较的默认实现;例如String,Integer等类都实现了Comparable接口。这些类提供了自己对象之间比较大小的默认实现,如果我们想一个对象自己有比较行为的话,就需要该类实现Comparable接口。

public class Test3 {
    public static void main(String[] args) throws Exception {
        Person person1 = new Person("张三", 20);
        Person person2 = new Person("李四", 30);
        Person person3 = new Person("王五", 10);
        List<Person> personList = Arrays.asList(person1, person2, person3);
        System.out.println("排序前=====================");
        personList.forEach(System.out::println);
        System.out.println("排序后=====================");
        Collections.sort(personList);
        personList.forEach(System.out::println);
    }

    static class Person implements Comparable<Person>{
        private String name;
        private Integer age;

        public Person(String name, int age) {
            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 String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
        
        //Person按照年龄排序
        @Override
        public int compareTo(Person o) {
            return this.getAge().compareTo(o.getAge());
        }
    }
}

运行结果:

排序前=====================
Person{name='张三', age=20}
Person{name='李四', age=30}
Person{name='王五', age=10}
排序后=====================
Person{name='王五', age=10}
Person{name='张三', age=20}
Person{name='李四', age=30}

compareTo方法的返回值是int,有三种情况(比较者=调用compareTo方法者;被比较者=也就是compareTo方法接受对象):

1、比较者大于被比较者,那么返回 1

2、比较者等于被比较者,那么返回 0

3、比较者小于被比较者,那么返回 -1

 

Comparator

Comparator可以认为是是一个外比较器,认为有两种情况可以使用实现Comparator接口的方式

(1)向集合中添加数据的时候,需要这个对象本身具备比较的行为(有源码的情况)

(2)一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。如:修改String的默认排序;再就是不能修改源码的情况

public class Test3 {
    public static void main(String[] args) throws Exception {
        //Person按照年龄排序
        Person person1 = new Person("张三", 20);
        Person person2 = new Person("李四", 30);
        Person person3 = new Person("王五", 10);
        List<Person> personList = Arrays.asList(person1, person2, person3);
        System.out.println("排序前=====================");
        personList.forEach(System.out::println);
        System.out.println("排序后=====================");
//        Collections.sort(personList, (o1, o2) -> {
//            //自定义规则
//            return o1.getAge().compareTo(o2.getAge());
//        });
        //简写方式
        personList.sort(Comparator.comparing(Person::getAge));
        // 多个字段的排序
//        personList.sort(Comparator.comparing(Person::getAge)
//            .thenComparing(Person::name);
        personList.forEach(System.out::println);
    }

    static class Person{
        private String name;
        private Integer age;

        public Person(String name, int age) {
            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 String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }

    }
}

运行结果:

排序前=====================
Person{name='张三', age=20}
Person{name='李四', age=30}
Person{name='王五', age=10}
排序后=====================
Person{name='王五', age=10}
Person{name='张三', age=20}
Person{name='李四', age=30}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值