java.lang.Comparable 和 java.util.Comparator compareTo 区别

实现比较接口与比较器接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则。

1.Comparable:

此接口强行对实现它的每个类的对象进行整体排序。排序此被称为该类的自然排序 ,类的  的compareTo  方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过  Collections.sort  (和  Arrays.sort  )进行自动排序。实现此接口的对象可以使用有序映射表中的键或有序集合中的元素,无需指定比较器。强烈推荐(虽然不是必须的)使自然排序与等于一致。所谓与等于一致是指对于类  的每一个  e1  和  e2  来说,当且仅当  (e1.compareTo((Object)e2)== 0)  e1.equals((对象)e2)  具有相同的布尔值时,类  的自然排序才叫做与equals一致 。

2. Comparator:

是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较.Comparator体现了一种策略模式),就是不改变对象自身,而用一个策略对象(策略对象)来改变它的行为。

不同之处:

 1排序规则实现的方法不同

    Comparable接口的方法:compareTo(Object o)

    比较器接口的方法:比较(T o1,To2)

 2类设计前后不同

      可比接口用于在类的设计中使用;

   比较器接口用于类设计已经完成,还想排序(阵列);


Comparator和Comparable的区别:
可比

比较定义在Person类的内部:

public class Persion实现了Comparable {..比较Person's大小..},

 因为已经实现了比较器,那么我们的人现在是一个可以比较大小的对象了,它的比较功能和字符串完全一样,可以随时随地的拿来
比较大小,因为人现在自身就是有大小之分的.Collections.sort(personList)可以得到正确的结果。

比较

Comparator是定义在Person的外部的,此时我们的Person类的结构不需要有任何变化,如

public class Person {String name; int age},

然后我们另外定义一个比较器:

public PersonComparator实现Comparator(){..比较Person的大小..},

在PersonComparator里面实现了怎么比较两个人的大小。所以,用这种方法,当我们要对一个personList进行排序的时候,
我们除了了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person's大小是在PersonComparator
里面实现的,如:

Collections.sort(personList,new PersonComparator())。

Comparator和Comparable的实例:
 
可比:

实现Comparable接口要覆盖compareTo方法,在compareTo方法里面实现比较:
公共类Person实现Comparable {
     字符串名称;
     整年龄
     public int compareTo(Person another){
          int i = 0;
          i = name.compareTo(another.name); //使用字符串的比较
          if(i == 0){//如果名字一样,比较年龄,返回比较年龄结果
               回归年龄 -  another.age;
          } else {
               回报我; //名字不一样,返回比较名字的结果。
          }
     }
}
   这时我们可以直接用Collections.sort(personList)对其排序了。

比较:

实现比较器需要覆盖比较方法:
public class Person {
     字符串名称;
     整年龄
}

类PersonComparator实现比较器{ 
     public int compare(Person one,Person another){
          int i = 0;
          i = one.name.compareTo(another.name); //使用字符串的比较
          if(i == 0){//如果名字一样,比较年龄,返回比较年龄结果
               返回one.age  -  another.age;
          } else {
               回报我; //名字不一样,返回比较名字的结果。
          }
     }
}
   Collections.sort(personList,new PersonComparator())可以对其排序
总结:
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,
但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义
的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自
己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值