Comparable和Comparator的区别

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

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

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

   注意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;
    }
}
上一篇:“不能取消引用double” [Java lang.]


下一篇:BigDecimal 的用法