• 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("
    排序后");
            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.方便应对多变的排序规则
  • 相关阅读:
    hdu 1077计算几何
    hdu 1110几何题
    hdu 4430二分枚举
    numpy常用技巧
    python中数组(list/array)不会复制,而是直接引用
    怎么在ASP.NET 2.0中使用Membership
    2分法通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高)
    Oracle大数据量分页通用存储过程
    JavaScript 对象与数组参考大全
    ajax框架比较
  • 原文地址:https://www.cnblogs.com/xujiangxi/p/12356611.html
Copyright © 2020-2023  润新知