zoukankan      html  css  js  c++  java
  • Comparable和Comparator的区别

       Comparable 和 Comparator 都是接口,均为比较器

       Comparable相当于“内比较器”,而Comparator相当于“外比较器”

       实现Comparable的类,该类就具有自身比较的功能;Comparator的实现,是一个外部比较工具器 

       注意Comparable 和 Comparator 同时实现时,则以Comparator为主

     Comparable接口

      Comparable 被认为是内比较器,也是自然排序,实现该接口的类,会有自身比较的功能,则依赖compareTo方法的实现

      CompareTo方法的返回值是int,有三种情况:     

          1、比较者大于被比较者,那么返回正整数

          2、比较者等于被比较者,那么返回0

          3、比较者小于被比较者,那么返回负整数

    // Comparable 接口的定义
    public interface Comparable<T> 
    {
        public int compareTo(T o);
    }

      例子:String 本身就以实现Comparable ,所以可以调用它的compareTo方法进行比较

    class Person implements Comparable{
      // 其他属性  
        @Override
        public int compareTo(Person p){
              int temp = this.age - p.age;
              return temp == 0 ? this.name.compareTo(p.name) : temp;          
        }
    }

     Comparator接口

      Comparator 被认为是外比较器,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口覆盖compare(T o1, T o2)方法,即可,然后通过这个比较器对类进行比较且排序

      compare(T o1, T o2)方法,int返回值有三种情况:

        1、o1大于o2,返回正整数

        2、o1等于o2,返回0

        3、o1小于o3,返回负整数

      有两种场景可以使用实现Comparator接口的方式:

        1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

        2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是如他所愿 

      例子:

    public class PersonComparator implements Comparator<Person>
    {
        @Override
        public int compare(Person p1, Person p2)
        {
         int temp = p1.getName().compareTo(p2.getName);
            return temp == 0 ? p1.getAge() - p2.getAge() : temp;
        }
    }
  • 相关阅读:
    153. Find Minimum in Rotated Sorted Array
    228. Summary Ranges
    665. Non-decreasing Array
    661. Image Smoother
    643. Maximum Average Subarray I
    4.7作业
    面向对象编程
    常用模块3
    3.31作业
    常用模块2
  • 原文地址:https://www.cnblogs.com/stamp/p/java_base.html
Copyright © 2011-2022 走看看