Java中Comparable与Comparator的区别

相同

  • Comparable和Comparator都是用来实现对象的比较、排序
  • 要想对象比较、排序,都需要实现Comparable或Comparator接口
  • Comparable和Comparator都是Java的接口

区别

      • Comparator位于java.util包下,而Comparable位于java.lang包下
      • Comparable接口的实现是在类的内部(如 String、Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类的外部(可以理解为一个是自已完成比较,一个是外部程序实现比较)
      • 实现Comparable接口要重写compareTo方法, 在compareTo方法里面实现比较
      • 可以调用Arrays.sort或者Collections.sort()实现排序。
      •  array.sort(array),int/Integer array[] = {4,5,0,1,3,6}  看这个array数组是什么类型的
      • 如果要排序的数组类型是Integer类型则底层sort调用的是MergeSort,因为Integer是一个引用数据类型,存在对象内部二次排序的问题,是一个对象,所以稳定排序。  
        如果是int,则底层调用quickSort排序,因为Int类型是一个基本数据类型,不存在对象内部二次排序的问题,所以要调用非稳定排序。

 

实现Comparable接口要重写compareTo方法, 在compareTo方法里面实现比较

 1 public class Person implements Comparable<Person>{
 2     String name;
 3     int age;
 4     int weight;
 5     public Person(String name, int age,int weight)
 6     {
 7         super();
 8         this.name = name;
 9         this.age = age;
10         this.weight = weight;
11     }
12     public String getName()
13     {
14         return name;
15     }
16     public int getAge()
17     {
18         return age;
19     }
20     public int getWeight()
21     {
22         return weight;
23     }
24     @Override
25     public int compareTo(Person p)
26     {
27          if(this.age - p.age == 0){
28              return this.weight - p.weight;
29          }
30          else
31          {return this.age - p.age;}
32     }

 

public class UserInfo  {

    public static void main(String[] args)
    {
        Person[] people=new Person[]{
                new Person("xujian", 20,60),
                new Person("xiewei", 10,70),
                new Person("xiewei", 20,70)};
        System.out.println("排序前");
        for (Person person : people)
        {
            System.out.println(person.getName()+":"+person.getAge()+':'+person.weight);
        }
        Arrays.sort(people);
        System.out.println("\n排序后");
        for (Person person : people)
        {
            System.out.println(person.getName()+":"+person.getAge()+':'+person.weight);
        }
        int[] array = {123,2,3,4};
        Integer[] array1 = {123,2,3,4};
    }

  

实现Comparator需要重写 compare 方法

public class PersonComparator  {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("xujian", 20,60));
        personList.add(new Person("xiewei", 10,70));
        personList.add(new Person("xiewei", 20,70));
        System.out.println("排序前");
        for (Person person : personList)
        {
            System.out.println(person.getName()+":"+person.getAge()+':'+person.weight);
        }
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.age - o2.age == 0){
                    return o1.weight - o2.weight;
                }
                else
                {return o1.age - o2.age;}
            }
        });

        System.out.println("排序前");
        for (Person person : personList)
        {
            System.out.println(person.getName()+":"+person.getAge()+':'+person.weight);
        }
    }
}  

以上的例子中用到的是,稳定排序,先排序年龄,在年龄相同的情况下然后按照体重排序。

总结:

  • 如果比较的方法只要用在一个类中,用该类实现Comparable接口就可以。
  • 如果比较的方法在很多类中需要用到,就自己写个类实现Comparator接口,这样当要比较的时候把实现了Comparator接口的类传过去就可以,省得重复造轮子。这也是为什么Comparator会在java.util包下的原因。
    使用Comparator的优点是:1.与实体类分离 2.方便应对多变的排序规则
posted @ 2020-02-24 13:31  xujiangxi  阅读(216)  评论(0编辑  收藏  举报