Comparable与Comparator

文章讲述了Java中Comparable和Comparator接口用于对象排序的区别。Comparable是让类自身具备比较能力,需要修改类实现接口;Comparator则允许外部定义比较规则,不修改源代码,适用于复杂或通用的比较逻辑。示例展示了如何在Person类中分别实现这两个接口进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、相同点

都是java的一个接口, 并且是用来对自定义的class比较大小的

什么是自定义class?

public class Person{ 
 String name;
 int age;
}

当有这么一个personList,里面包含了person1, person2, persion3…

Collections.sort( personList ),是得不到预期的结果的

那为什么可以排序一个字符串list呢?

如 StringList{“hello1” , “hello3” , “hello2”}, Collections.sort( stringList ) 能够得到正确的排序, 那是因为
String 这个对象已经实现了 Comparable接口 , 所以 Person 如果想排序, 也要实现一个比较器

2、不同点

2.1、Comparable

Comparable 定义在 Person类的 内部

public class Persion implements Comparable {
    //..比较Person的大小..
}

因为已经实现了比较器,那么Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的

Collections.sort(personList)可以得到正确的结果

2.2、Comparator

Comparator 是定义在Person的 外部

此时Person类的结构不需要有任何变化

public class Person{ 
    String name;
    int age;
}

另外定义一个比较器

public PersonComparator implements Comparator {
    //..比较Person的大小..
}

在PersonComparator里面实现了怎么比较两个Person的大小

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

如:Collections.sort( personList , new PersonComparator() )

3、实例

3.1、Comparable

实现Comparable接口要覆盖compareTo方法, 在compareTo方法里面实现比较:

public class Person implements Comparable {
     String name;
     int age
     public int compareTo(Person another) {
          int i = 0;
          // 使用字符串的比较
          i = name.compareTo(another.name); 
          // 如果名字一样,比较年龄, 返回比较年龄结果
          if(i == 0) { 
               return age - another.age;
          } else {
               // 名字不一样, 返回比较名字的结果
               return i; 
          }
     }
}

这时可以直接用 Collections.sort( personList ) 对其排序了

3.2、Comparator

Person不需要变化

public class Person{
     String name;
     int age;
}

实现Comparator需要覆盖 compare 方法

class PersonComparator implements Comparator { 
     public int compare(Person one, Person another) {
          int i = 0;
          // 使用字符串的比较
          i = one.name.compareTo(another.name); 
          // 如果名字一样,比较年龄,返回比较年龄结果
          if(i == 0) { 
               return one.age - another.age;
          } else {
               // 名字不一样, 返回比较名字的结果.
               return i; 
          }
     }
}

Collections.sort( personList , new PersonComparator()) 可以对其排序

4、总结

  • 两种方法各有优劣

  • Comparable 简单,只要实现Comparable 接口的对象直接就成为可以比较的对象,但是需要修改源代码

  • Comparator 的好处是不需要修改源代码,而是另外实现一个比较器,当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了

参考于 https://www.cnblogs.com/sunflower627/p/3158042.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土味儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值