圆圆网络 手游攻略 手游评测 面试官:元素排序的Comparable和Comparator有什么区别?

面试官:元素排序的Comparable和Comparator有什么区别?

时间:2024-10-20 11:14:42 来源:网络整理 浏览:0

在Java语言中,Comparable和Comparator都是用来对元素进行排序的,但是它们有本质的不同。这两个也是常见的面试题,所以今天我们就一起来讨论一下。

1.字面含义不同

我们先从两者的字面意思来理解。 Comparable翻译成中文就是“比较”,Comparator就是“比较器”的意思。 Comparable以-able结尾,表明它具有一定的能力,而Comparator以-or结尾,表明它是比较的参与者。这是从字面意思来理解两者的区别。

2.用法不同

都是顶级接口,但是方法和用法不同。下面我们分别来看一下。

2.1 Comparable

Comparable 接口只有一种方法,compareTo。实现Comparable接口并重写compareTo方法可以实现某个类的排序。它支持通过Collections.sort 和Arrays.sort 进行排序。

当我们不使用Comparable时,程序的执行是这样的:

import lombok.Getter;import lombok.Setter;import lombok.ToString;import java.util.ArrayList;import java.util.List;public class ComparableExample { public static void main(String[] args) { //创建对象Person p1=new Person(1, 18, 'Java'); Person p2=new Person(2, 22, 'MySQL'); Person p3=new Person(3, 6, 'Redis'); //添加到集合ListPerson list=new ArrayList();列表.add(p1);列表.add(p2);列表.add(p3); //打印集合信息list.forEach(p - System.out.println(p.getName() + ':' + p.getAge())); }}//下面的set/get/toString都使用了lombok提供的注解@Getter @Setter@ToStringclass Person { private int id;私有整数年龄;私有字符串名称;公共Person(int id, int 年龄, 字符串名称) { this.id=id; this.age=年龄; this.name=名称; }}程序执行结果如下:

面试官:元素排序的Comparable和Comparator有什么区别?

从上图可以看出,当自定义类Person没有实现Comparable时,List集合是没有排序的,只能以元素的插入顺序作为输出顺序。

Comparable的使用是在自定义对象类中实现Comparable接口,并重写compareTo方法来实现自定义排序规则。具体实现代码如下:

导入lombok.Getter;导入lombok.Setter;导入lombok.ToString;导入java.util.ArrayList;导入java.util.Collections;导入java.util.List;公共类ComparableExample { public static void main(String[] args) { //创建对象Person p1=new Person(1, 18, 'Java'); Person p2=new Person(2, 22, 'MySQL'); Person p3=new Person(3, 6, 'Redis'); //将对象添加到集合ListPerson list=new ArrayList();列表.add(p1);列表.add(p2);列表.add(p3); //进行排序操作(按照Person类Rules中compareTo中定义的排序) Collections.sort(list); //输出集合中的顺序list.forEach(p - System.out.println(p.getName() + ':' + p.getAge())); }}//下面的set/get/toString都是使用lombok提供的注解来实现@Getter@Setter@ToStringstatic class Person Implements ComparablePerson { private int id;私有整数年龄;私有字符串名称;公共Person(int id, int 年龄, 字符串名称) { this.id=id; this.age=年龄; this.name=名称; } @Override public int CompareTo(Person p) { return p.getAge() - this.getAge(); }}程序执行结果如下图:

compareTo 排序方法说明

compareTo方法接收到的参数p是要比较的对象。排序规则是将当前对象与要比较的对象进行比较,然后返回一个int类型的值。从小到大正序排序规则为:用当前对象值减去要比较对象的值;而从大到小倒序排序规则则恰恰相反:用比较对象的值减去当前对象的值。

注意:如果自定义对象没有实现Comparable接口,那么就无法使用Collections.sort方法进行排序,编译器会提示如下错误:

2.2 Comparator

Comparator和Comparable的排序方式不同。 Comparable的排序方法是compareTo,Comparator的排序方法是compare。具体实现代码如下:

导入lombok.Getter;导入lombok.Setter;导入java.util.ArrayList;导入java.util.Collections;导入java.util.Comparator;导入java.util.List;公共类ComparatorExample { public static void main(String[] args) { //创建对象Person p1=new Person(1, 18, 'Java'); Person p2=new Person(2, 22, 'MySQL'); Person p3=new Person(3, 6, 'Redis' ); //将对象添加到集合ListPerson list=new ArrayList();列表.add(p1);列表.add(p2);列表.add(p3); //执行排序操作(根据PersonComparator 中定义的排序规则) Collections.sort(list, new PersonComparator()); //输出集合中的顺序list.forEach(p - System.out.println(p.getName() + ':' + p.getAge())); }}/** * Person 类的比较器*/class PersonComparator 实现ComparatorPerson { @Override public int Compare(Person p1, Person p2) { return p2.getAge() - p1.getAge(); } }}@Getter @Setterclass Person { 私有int id;私有整数年龄;私有字符串名称;公共Person(int id, int 年龄, 字符串名称) { this.id=id; this.age=年龄; }} 程序的执行结果如下所示:

面试官:元素排序的Comparable和Comparator有什么区别?

扩展:Comparator 匿名类

比较器除了创建自定义比较器之外,您还可以使用匿名类来更快速、方便地完成自定义比较器的功能。具体代码实现如下:

import lombok.Getter;import lombok.Setter;import java.util.ArrayList;import java.util.Comparator;import java.util.List;public class ComparatorExample { public static void main(String[] args) { //构建并merge 添加数据ListPerson list=new ArrayList(); list.add(new Person(1, 18, 'Java')); list.add(new Person(2, 20, 'MySQL')); list.add(new Person(3, 6, 'Redis')); //使用Comparator匿名类进行排序list.sort(new ComparatorPerson() { @Override public int Compare(Person p1, Person p2) { return p2.getAge() - p1.getAge(); } }); //打印集合数据list.forEach(p - System.out.println(p.getName() + ':' + p.getAge())); }}@Getter@Setterstatic class Person { private int id;私有整数年龄;私有字符串名称;公共Person(int id, int 年龄, 字符串名称) { this.id=id; this.age=年龄; this.name=名称; }} 程序执行结果如下图所示:

3.使用的场景不同

从上面例子的实现代码中我们可以看出,使用Comparable必须修改原有的类,即如果要对类进行排序,必须实现Comparable接口并重写该类中的compareTo方法,所以Comparable 更像是一个“内部”排序的接口。

比较器的使用有所不同。 Comparator不需要修改原来的类。也就是说,在最极端的情况下,即使Person类是第三方提供的,我们仍然可以通过新建一个自定义比较器Comparator来实现第三方Person类的排序功能。也就是说,Comparator接口可以与原有类解耦,无需修改原有类即可实现排序功能。因此,Comparator可以看作是一个“对外”提供排序的接口。

总结

Comparable和Comparator都是用来实现元素排序的。它们之间的区别如下:

Comparable是“比较”的意思,Comparator是“比较者”的意思; Comparable通过重写compareTo方法实现排序,Comparator通过重写compare方法实现排序; Comparable 必须在内部通过自定义类方法进行排序,而Comparator 则在外部定义并实现排序。所以用一句话来总结两者的区别:Comparable可以看成是一种“内部”排序接口,而Comparator则是一种“外部”排序接口。

用户评论

疯人疯语疯人愿

看了这个问题我瞬间懵了,这两种怎么都分不清呀,搞得我对Java基础也有些怀疑。

    有12位网友表示赞同!

龙吟凤

挺有意思的题目,让我重新梳理了Comparable和Comparator的概念,对编程知识的复习很有帮助。

    有7位网友表示赞同!

ー半忧伤

面试官问起来才知道这两个的区别,平时自己做项目都没管这些细节。

    有6位网友表示赞同!

七级床震

整理一下思路回答完这个问题后,感觉自己Java的基础稳固了很多,谢谢指点!

    有11位网友表示赞同!

绝版女子

看了这个题才知道,在实际工作中这两个概念应用还是很常见的。

    有11位网友表示赞同!

景忧丶枫涩帘淞幕雨

准备面试的时候一定要注意基础知识点的全面复习哦,这点挺重要。

    有15位网友表示赞同!

刺心爱人i

这道题真是直击灵魂,以后在编码路上再也不怕被这类问题问倒了。

    有6位网友表示赞同!

青瓷清茶倾城歌

感觉自己之前的项目经验中忽略了太多细节性的东西,这个问题给了我很好的反思机会。

    有14位网友表示赞同!

念安я

面试官用这种方式考察技术深度,我收获了很多新思路和知识点。

    有14位网友表示赞同!

怀念·最初

原来自己对Comparable还有些误解,在准备下一次技术面试时一定会把这个点弄得清清楚楚的。

    有5位网友表示赞同!

熟悉看不清

整理答案的时候才发现这两个接口使用有那么多讲究,感觉自己以后在代码设计上要更严谨了。

    有18位网友表示赞同!

眼角有泪°

这个问题激发了我对于java基础更深入的思考,真的很感谢这次机会。

    有18位网友表示赞同!

我的黑色迷你裙

原来以为自己对这些概念掌握了,但看来还需要更深入地去探索与实践才是。

    有20位网友表示赞同!

有一种中毒叫上瘾成咆哮i

从这道问题中悟出的不只是解题技巧,更多的是编程思维的提升和知识体系的完善。

    有9位网友表示赞同!

从此我爱的人都像你

准备面试的过程中遇到这样一题,不仅加强了自己的Java功底,还强化了自我学习的能力。

    有15位网友表示赞同!

话扎心

这个题目让我深入理解了面向接口编程的重要性,并学会用更系统的方式去思考问题。

    有18位网友表示赞同!

陌潇潇

这次面试的问题给了我一个很好的总结点,接下来我要对这些概念进行全面复习。

    有11位网友表示赞同!

寻鱼水之欢

在实际工作中,确实会遇到需要对比和排序的场景,了解这两种的不同就显得很重要。

    有13位网友表示赞同!

江山策

面试官抛出这样一道题真的挺良心的,这下我对相似类的概念也清晰了不少。

    有19位网友表示赞同!

念旧情i

这个经验提醒我要在平时多做些深入研究和实践,对基础知识的巩固才能走得更远。

    有18位网友表示赞同!

标题:面试官:元素排序的Comparable和Comparator有什么区别?
链接:https://yyuanw.com/news/sypc/20489.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2024-10-20
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2024-10-20
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2024-10-20
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2024-10-20