comparator和comparable的区别

时间:2025-04-05 07:24:56

前言:

comparator和comparable都是用来实现集合中元素的排序比较的。Comparator位于包下,而Comparable位于包下。他们之间的区别在于用法上。Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口),对自己写的类实现这一接口来实现按自己规则排序。总结起来就是comparator在外。comparable在内,都是按程序猿自己想法实现排序

一、Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现

代码:

package com.awakeyo;

/**
 * @author awakeyoyoyo
 * @className Person
 * @description TODO
 * @date 2020-01-15 16:25
 */
public class Person implements Comparable<Person>{
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }

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

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        return this.age-o.age;
    }
}

调用代码

List<Person> list = new ArrayList<>(100);
        Person person;
        for (int i=0; i<75; i++) {
            person = new Person("person " + i, i);
            list.add(person);
        }
        Collections.shuffle(list);
        Collections.sort(list);
        list.stream().forEach(e->System.out.println(e.toString()));
二、Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:

1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式
实现代码:

  Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.getAge()-o1.getAge();
            }
        });
        list.stream().forEach(e->System.out.println(e.toString()));

最后总结一下两者的不同点:

comparator comparable
排序代码实现 在调用时实现 在需排序对象类中实现被称为自然排序
实现 实现comparator接口的compare方法 实现comparator接口的compareTo方法
所在包
触发排序 (list,new Comparator(){…}) (list)