Java:Comparable和Comparator区别

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:Comparable和Comparator区别相关的知识,希望对你有一定的参考价值。

文章目录

Comparable

首先在Comparable是在 java.lang 包中

Comparable 是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,所以他们可以调用compareTo方法 完成比较大小操作,例如String的:

public class ComparatorAndComparable 
    public static void main(String[] args) 
        String s1 ="1";
        String s2 ="2";
        System.out.println(s1.compareTo(s2));
    

运行结果:

  • 1:前面的大
  • 0:相等
  • -1:后面的大

自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。

因此我们需要在实现了Comparable接口的类中重写compareTo(T o)方法。

实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序

代码案例:

先写一个实现了Comparable接口的person类:

package com.interview.module.compara;

import java.util.Arrays;

class Person implements Comparable<Person> 
    String name;
    int age;

    public Person(String name, int age) 
        super();
        this.name = name;
        this.age = age;
    

    public Person() 
        super();
    

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


public class ComparableTest 
    public static void main(String[] args) 
        Person p1 = new Person("zhangsan", 20);
        Person p2 = new Person("lisi", 18);
        Person p3 = new Person("wangwu", 25);

        Person[] persons = p1, p2, p3;
        System.out.println("排序前");
        for (Person person : persons) 
            System.out.println(person.name + ":" + person.age);
        
        //Arrays是数组工具类,Collections是集合工具类
        Arrays.sort(persons);
        System.out.println("排序后");
        for (Person person : persons) 
            System.out.println(person.name + ":" + person.age);
        
    

运行结果:

Comparator

首先在Comparable是在 java.util包中

Comparator被称为外部比较器,是因为如果我们需要对某个类(为了便于理解,我们这里称这个类为类A)进行排序(该类本身不支持排序),我们可以另外定义一个实现了Comparator接口的类(类B)来作为类A的“比较器”。

这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

注意:

  1. 类B即实现了Comparator接口的类,一定要实现compare(T o1, T o2)方法,该方法中就是我们自定义的对类A进行比较的规则 ;
  2. int compare(T o1, T o2) 是“比较o1和o2的大小”。
    • 返回“负数”,意味着“o1比o2小”;
    • 返回“零”,意味着“o1等于o2”;
    • 返回“正数”,意味着“o1大于o2”。

我的记忆方法:
this-传进来的o 或者 (a,b)-> a-b ;(前面的减后面的)
这都是从小到大排序

代码案例

package com.interview.module.compara;

import java.util.Arrays;
import java.util.Comparator;

class Person 
    String name;
    int age;

    public Person(String name, int age) 
        super();
        this.name = name;
        this.age = age;
    

    public Person() 
        super();
    


public class ComparatorTest implements Comparator<Person> 

    @Override
    public int compare(Person o1, Person o2) 
        return o1.age - o2.age;
    

    public static void main(String[] args) 
        Person p1 = new Person("zhangsan", 20);
        Person p2 = new Person("lisi", 18);
        Person p3 = new Person("wangwu", 25);

        Person[] persons = p1, p2, p3;
        System.out.println("排序前");
        for (Person person : persons) 
            System.out.println(person.name + ":" + person.age);
        

        Arrays.sort(persons, new ComparatorTest());
        System.out.println("排序后");
        for (Person person : persons) 
            System.out.println(person.name + ":" + person.age);
        
    


运行结果如下所示:

总结

Comparable和Comparator都可以用来进行比较、排序。

Comparable可以直接在需要进行排序的类中实现,重写compateTo(T o)方法;
Comparator需要另外顶一个实现Comparator接口的实现类来作为“比较器”。

二者各有优缺点

  • 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码

  • Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

以上是关于Java:Comparable和Comparator区别的主要内容,如果未能解决你的问题,请参考以下文章

[java]Comparable和Comparator

Comparator

Comparable接口

集合框架(TreeSet原理)

Java集合-案例

自然排序Comparable的使用