Java中Comparable与Comparator的区别

来源:互联网 发布:区块链的共识机制 算法 编辑:程序博客网 时间:2024/05/29 17:53

在Java中Comparable和Comparator都是对集合进行排序的,都是通过返回-1、0、1来进行交换,但是两种方式有差别。

  • Comparable:使用集合内部元素的排序方法(compareTo)进行排序,所以内部比较的元素要实现Comparable接口。
  • Comparator:使用外部Comparator对象的(compare方法)排序方式,所以集合需要实现Comparator接口的对象。

例如我们又一个Person类,如果我们把该类的对象放入list集合当中,对象在集合中的顺序就是放入的顺序。

import java.util.ArrayList;public class ComparableTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        ArrayList<Person> list=new ArrayList<>();        list.add(new Person("a", 20));        list.add(new Person("b", 16));        list.add(new Person("c", 50));        for(int i=0;i<list.size();i++){            System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age);        }    }}class Person{    String name;    int age;    Person(String name,int age){        this.name=name;        this.age=age;    }}

输出结果是:
name:a;age:20
name:b;age:16
name:c;age:50

但是如果我们想要person对象在集合中的顺序是按年龄排序的了,这时候我们就需要对集合进行排序了。可以使用Collections.sort方法。使用Collections.sort有两种方式:

  • sort(List list),直接传入集合对象,但需要集合的内部元素有实现Comparable,它采用的内部类的compareTo方法进行比较。
  • sort(List list, Comparator< super T> c) ,该方法不仅需要传入排序的集合,还有实现Comparator接口的对象,它采用Comparator对象的compare进行比较。

1.使用内部元素的排序方法,需要实现Compareble。

package execise;import java.util.ArrayList;import java.util.Collections;public class ComparableTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        ArrayList<Person> list=new ArrayList<>();        list.add(new Person("a", 20));        list.add(new Person("b", 16));        list.add(new Person("c", 50));        Collections.sort(list);        for(int i=0;i<list.size();i++){            System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age);        }    }}class Person implements Comparable<Person>{    String name;    int age;    Person(String name,int age){        this.name=name;        this.age=age;    }    @Override    public int compareTo(Person p) {        // TODO Auto-generated method stub        if(age==p.age)            return 0;        else if(age>p.age)            return 1;        else            return -1;    }}

运行结果:
name:b;age:16
name:a;age:20
name:c;age:50

2.使用Comparator对象。

package execise;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class ComparableTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        ArrayList<Person> list=new ArrayList<>();        list.add(new Person("a", 20));        list.add(new Person("b", 16));        list.add(new Person("c", 50));        Collections.sort(list, new Comparator<Person>(){            @Override            public int compare(Person p1, Person p2) {                // TODO Auto-generated method stub                if(p1.age==p2.age)                    return 0;                else if(p1.age>p2.age)                    return 1;                else                    return -1;            }        });        for(int i=0;i<list.size();i++){            System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age);        }    }}class Person {    String name;    int age;    Person(String name,int age){        this.name=name;        this.age=age;    }}

运行结果:
name:b;age:16
name:a;age:20
name:c;age:50

3.总结
两种方式采用Comparator更好一些,因为Comparable代码侵入太高,比较部分和类的逻辑耦合在一起,如果要改变排序方法就必须修改类的代码;而Comparator的耦合低。

2 0