美文网首页
Comparable和Comparator的区别

Comparable和Comparator的区别

作者: 竖起大拇指 | 来源:发表于2020-05-08 17:51 被阅读0次

Comparable

java.lang.Comparable接口的定义,源码如下:

public interface Comparable<T> {
      public int compareTo(T o);
}

如果一个类实现了Comparable接口,就可以按照自己制定的规则将由它创建的对象进行比较.下面给出一个例子:

public class Cmower implements Comparable<Cmower> {
    private int age;
    private String name;

    public Cmower(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(Cmower o) {
        return this.getAge() - o.getAge();
    }

    public static void main(String[] args) {
        Cmower wanger = new Cmower(19,"王二");
        Cmower wangsan = new Cmower(16,"王三");

        if (wanger.compareTo(wangsan) < 0) {
            System.out.println(wanger.getName() + "比较年轻有为");
        } else {
            System.out.println(wangsan.getName() + "比较年轻有为");
        }
    }
}

在上面的示例中,我创建了一个Cmower类,它由两个字段:age和name。Cmower类实现了Comparable接口,并重写了compareTo()方法。该方法的返回值可能为负数,零或者正数,代表的意思是该对象排序的规则小于,等于或者大于要比较的对象。

2.Comparator

java.util.Comparator的接口定义相比Comparable复杂点,不过核心方法就只有两个,

public interface Comparator<T> {

  int compare(T o1, T o2);
  boolean equals(Object obj);
}

第一个方法compare(T o1,T o2)的返回值可能为负数,零或者正数,代表意思是第一个对象小于,等于或者大于第二个对象。
第二个方法equals(Object obj)需要传入一个Object作为参数,并判断改Object是否和Comparator保持一致。
有时候,我们想让类保持它的原貌,不想主动实现Comparable接口,但我们又需要它们之间进行比较,该怎么办?
Comparator就派上用场了。

public class Cmower  {
    private int age;
    private String name;

    public Cmower(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

Cmower类有两个字段:age和name,意味着该类可以安装age或者name进行排序。
再来看Comparator接口的实现类:

public class CmowerComparator implements Comparator<Cmower> {
    @Override
    public int compare(Cmower o1, Cmower o2) {
        return o1.getAge() - o2.getAge();
    }
}

测试类:

Cmower wanger = new Cmower(19,"王二");
Cmower wangsan = new Cmower(16,"王三");
Cmower wangyi = new Cmower(28,"王一");

List<Cmower> list = new ArrayList<>();
list.add(wanger);
list.add(wangsan);
list.add(wangyi);

list.sort(new CmowerComparator());

for (Cmower c : list) {
    System.out.println(c.getName());
}

我们来看下输出的结果:

王三
王二
王一

这意味着王三的年纪比王二小,排第一位;王一的年纪比王二大,排第三位。

3.到底该用哪一个呢?

  • 一个类实现了 Comparable 接口,意味着该类的对象可以直接进行比较(排序),但比较(排序)的方式只有一种,很单一。
  • 一个类如果想要保持原样,又需要进行不同方式的比较(排序),就可以定制比较器(实现 Comparator 接口)

举个不恰当的例子。我想从上海出发去北京看长城,要么坐飞机,要么坐高铁;但如果是孙悟空的话,翻个筋斗就到了。我和孙悟空之间有什么区别呢?孙悟空自己实现了 Comparable 接口(他那年代也没有飞机和高铁,没得选),而我可以借助 Comparator 接口(现代化的交通工具)。

总而言之,如果对象的排序需要基于自然顺序,请选择 Comparable,如果需要按照对象的不同属性进行排序,请选择 Comparator。

相关文章

网友评论

      本文标题:Comparable和Comparator的区别

      本文链接:https://www.haomeiwen.com/subject/qpqqnhtx.html