前言

    首先,要声明原文出处,原文链接: Comparator和Comparable的区别使用
    其次,我说一下为什么要写或者转载这篇文章。今天在看《尚学堂马士兵java教程》容器一章中,讲到对容器进行排序,是排序类通过实现Comparable的compareTo方法,然后调用Collections.sort方法。但是,我同时又在看《java核心技术》基础篇,万万没想到,书上的示例是实现了Comparator的compare接口,然后调用Collections.sort(List<T>list, Comparator<? super T> c)。第一次接触这块的我当时就蛋疼了,后续就是各种查资料,顺便还复习了一下策略模式。
    最后,本来想自己总结一下,没想到google了一篇如此简洁易懂的文章,就直接转载了。

Comparable和Comparator的区别

    简单的说:
  • 实现Comparable接口可以直接使用sort方法Collections.sort(List list)排序。
  • 实现Comparator接口可以用Collections.sort(List list, Comparator c)排序。
    一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以 直接使用sort方法排序。
    Comparator可以看成是一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
  1. 类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序从而不必改变对象本身。
  2. 可以使用多种排序标准,比如升序、降序等。

Comparable实例

package coreJavaOne;

import java.util.Arrays;

public class User implements Comparable<User> {
    private String id;
    private int age;

    public User(String id, int age) {
        this.id = id;
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

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

    public String toString() {
        return "[ id = " + this.id + ", age = " + this.age + "]";
    }

    public int compareTo(User other) {
        return this.age - other.getAge();
    }

    public static void main(String args[]) {
        User[] users = {new User("wangzhengyi", 26), new User("bululu", 27)};

        Arrays.sort(users);

        for (int i = 0; i < users.length; i++) {
            System.out.println(users[i]);
        }
    }
}

Comparator实例

package coreJavaOne;

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

class User implements Comparable<User> {
    private String id;
    private int age;

    public User(String id, int age) {
        this.id = id;
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

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

    public String toString() {
        return "[ id = " + this.id + ", age = " + this.age + "]";
    }

    public int compareTo(User other) {
        return this.age - other.getAge();
    }
}

public class SampleComparator implements Comparator<User> {
    /**
     * 重写接口方法,按照年龄从大到小排序(注意:Comparable示例是按照年龄从小到大排序)
     */
    public int compare(User o1, User o2) {
        return o2.getAge() - o1.getAge();
    }
    
    public static void main(String args[]) {
        User[] users = {new User("wangzhengyi", 26), new User("bululu", 27)};
        
        Arrays.sort(users, new SampleComparator());
        
        for (int i = 0; i < users.length; i ++) {
            System.out.println(users[i]);
        }
    }
}

ps:自己改写了Comparator的测试用例,这样对比性更好一些
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐