Comparable接口和Comparator接口区别详解(小白理解谢谢支持!!)

简述Comparable和Comparator两个接口的区别

Comparable:强行对实现它的每个类的对象进行整体排序。

这种顺序被称为类的自然顺序

类的compareTo方法被称为自然的比较方法,只能在类中实现compareTo()

一次,不能经常修改类的代码实现自己想要的顺序。

实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序

对象可以用作有序映射中的键或者有序集合中的元素,不用指定比较器。

Comparator:强行对某个对象进行整体排序。

 可以将Comparator传递给sort方法(Collections.sort或Arrays.sort)

从而允许在排序顺序上实现精准控制

还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,

​ 或者为那些没有自然顺序的对象collection提供排序。

Comparable接口和Comparator接口的区别

  • Comparable接口位于java.lang包下;Comparator位于java.util包下
  • Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序
  • 如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。
  • 这上面摘大佬理解https://blog.csdn.net/IT_10/article/details/104747173
  • Comparable是适合给类使用的 类之间 对象的比较
public int compareTo(User o){

if(this.age>o.getAge()){

return1;

}elseif(this.age<o.getAge()){

return-1;*//**这里的值会影响排序是降序还是升序*

}else{

return0;

}

}

*Comparablecomparable=(o1)->{*

*//returnthis.age-o1.age;*

*//};//**这个只适合类比*

*//**如果****为**intStirng**这种就无法实现*

 
  • Comparator 比较器可以被类实现也可以在外部实现 也是实现2个类直接的比较 需要重写的方法 是2个参数 2个 对象(参数)进行比较
public int compare(Child o1,Child o2){

returno1.getAge()>o2.getAge()?1:(o1.getAge()==o2.getAge()?0:-1);

}

更适合在外部实现 ,也可以是2个值进行比较

Arrays.*sort*(users,(o1,o2)->{

returno1.getAge()-o2.getAge();

});

*//**也可以通过**2**参数进行**lambda**实现**comparatore**接口

集合数据结构

作为SortedMap的Key必须实现Comparable接口,或者传入Comparator;

当 使用 内部为有序 或者排序接口的Map或者set 集合存储数据时,必须实现Comparable接口!!或者外部实现

Comparator比较器!!! 注!! 实现方法时 返回值必须 为 3种情况 -1,1,0

大于和小于 以及相等的情况!!!

Exception in thread “main” java.lang.ClassCastException: class aCsCsCsCs.Comparable.SortAndSet cannot be cast to class java.lang.Comparable (aCsCsCsCs.Comparable.SortAndSet is in unnamed module of loader ‘app’;

报classCastException异常!

所以在使用有序set或者有序Map存储元素时存储的对象必须实现Comparable接口

否则必须外部实现 Comparator**接口 如:

TreeSet<SortAndSet> sets =new TreeSet<>(newComparator<SortAndSet>(){

@Override

publicintcompare(SortAndSeto1,SortAndSeto2){

returno1.age-o2.age;

}

});

即 在创建集合时传入一个newComparator比较器!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值