写在开头

面试官:“我们在Java的集合和数据结构中都离不开比较器,请你聊一聊Comparable 和 Comparator 这两种的区别吧”

内心活动:“上来就这么直接吗,那些ArrayList,HashMap都不问呀,好,既然如此,那让我来征服你吧,面试官大人!”

我:“好滴!巴拉巴拉~”

Comparable

Comparable是java.lang包下的一个接口,其内部构造非常简单,只有一个compareTo()方法,使用起来也很简单,直接实现接口,重写方法即可。

【源码解析1】

public interface Comparable<T> {
int compareTo(T t);
}

【代码示例1】

定义一个Person类,重写compareTo()方法,用以比较Person对象的年龄大小

@Data
public class Person implements Comparable<Person>{ private int age;
private String name; public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Person o) {
return this.getAge()-o.getAge();
}
}

写一个测试类,调用

【代码示例2】

public class Test {
public static void main(String[] args) {
Person xiaoming = new Person(18, "小明");
Person xiaohua = new Person(20, "小华");
if(xiaoming.compareTo(xiaohua) <0){
System.out.println(xiaoming.getName()+"更年轻");
}else{
System.out.println(xiaohua.getName()+"更年轻");
}
}
}

输出:

小明更年轻

以上是我们自己实现的Comparable接口,其实在Java中像String、基本类型的包装类在底层也都实现了这个接口,并重写了compareTo()方法,因此,他们也拥有比较属性。

【代码示例3】

Integer in1 = 2;
Integer in2 = 3;
System.out.println(in1.compareTo(in2));

输出:

-1

Comparator

Comparator 是java.util包中的一个接口,它的底层构造相比较Comparable要复杂的多了,不过我们主要还是关注其中的compare()方法。

【源码解析2】

public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}

讲到这里,我们可以对比Comparable接口进行阐述,解释一下为什么有个相似的比较排序接口,还要设计Comparator,因为很多时候我们并不想破坏原始类的结构,比如Person类中,我们只需要它拥有age和name,不想写一些实现方法在其中,这个时候就需要Comparator啦!

1)首先,我们可以为Person类自定义一个比较器

【代码示例4】

public class PersonalComparator implements Comparator<Person> {

    @Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}

2)然后,我们写一个测试类使用一下看看,其实这里面要借助一个List的sort()进行调用,我们直接手撕代码,这样更容易理解!

【代码示例5】

public class Test {
public static void main(String[] args) {
Person xiaoming = new Person(20, "小明");
Person xiaohua = new Person(18, "小华"); ArrayList<Person> objects = new ArrayList<>();
objects.add(xiaoming);
objects.add(xiaohua); objects.sort(new PersonalComparator()); for (Person object : objects) {
System.out.println(object.getName());
}
}
}

输出:

小华
小明

我们跟进去看一下sort()方法的底层源码,会发现,在它的底层实际上Arrays.sort进行数组排序,而使用的比较器,就是我们传入的自定义PersonalComparator 对象。

【源码解析3】

public void sort(Comparator<? super E> c) {
// 保存当前队列的 modCount 值,用于检测 sort 操作是否非法
final int expectedModCount = modCount;
// 调用 Arrays.sort 对 elementData 数组进行排序,使用传入的比较器 c
Arrays.sort((E[]) elementData, 0, size, c);
// 检查操作期间 modCount 是否被修改,如果被修改则抛出并发修改异常
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
// 增加 modCount 值,表示队列已经被修改过
modCount++;
}

好了,解释到这里,我想已经足以令面试官满意了,两者的底层实现,如何使用都进行了详细的阐述,但是!如果你足够自信,可以进一步延伸出Collections.sort(),它的底层其实也是比较器,只不过这个比较器没有特殊的实现,采用的自然排序规则(升序)。源码就不在这里展示了,爱钻研的小伙伴可以自己去看哈。

二者比较

1、一个类实现了 Comparable,意味着该类的对象可以直接进行比较(排序)
但比较(排序)的方式只有一种,很单一。 2、一个类如果想要保持原样,又需要进行不同方式的比较(排序),
就可以定制比较器(实现 Comparator 接口)。 3、Comparable 接口在 java.lang 包下,
而 Comparator 接口在 java.util 包下。

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉的更多相关文章

  1. 面试----java基础集合---------------------comparable和comparator 的区别

    comparable接口     是主要是用来自定义类存储在主要是TreeSet,TreeMap(键)集合中存储时,自定通过实现这种接口得到自然排序的功能. comparator 接口  是主要是用来 ...

  2. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  3. 你能说说Java中Comparable和Comparator的区别吗

    之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...

  4. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  5. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  6. Comparable和Comparator的区别&Collections.sort的两种用法

    在Java集合的学习中,我们明白了: 看到tree,可以按顺序进行排列,就要想到两个接口.Comparable(集合中元素实现这个接口,元素自身具备可比性),Comparator(比较器,传入容器构造 ...

  7. 浅谈Comparable与Comparator的区别

    平时进行自定义排序一直使用实现Comparable接口,一段时间后操作的时候居然发现有了个Comparator接口 上网差了些资料,总结笔记一下. 基本原理就是比较,底层是二叉树 比如是3,6,5,1 ...

  8. PAT——1055. 集体照 (比较comparable和comparator的区别)

    拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位置为m ...

  9. Comparable与Comparator的区别

    Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 一.Com ...

  10. Java学习之Comparable与Comparator的区别

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序 ...

随机推荐

  1. [转帖]一文带你了解mysql sql model的only_full_group_by模式

    https://zhuanlan.zhihu.com/p/368440685 Mysql only_full_group_by与Error 1055问题分析 1 声明 本文的数据来自网络,部分代码也有 ...

  2. [转帖]br 备份时排除某个库

    https://tidb.net/book/tidb-monthly/2023/2023-02/usercase/excluded-a-storeroom-during-br-backup 生产环境中 ...

  3. [转帖]Jmeter笔记:使用Jmeter向kafka发送消息

    https://www.cnblogs.com/daydayup-lin/p/14124816.html 日常工作中有时候需要向kafka中发送消息来测试功能或者性能,这时候我们怎么办呢?我之前是自己 ...

  4. 【转帖】基于官方rpm包方式安装Oracle19c

    https://blog.whsir.com/post-5489.html   本文基于Centos7.x环境,通过官方提供的rpm包来安装19c 1.下载Oracle19c安装包 https://w ...

  5. jcmd的简单总结

    jcmd的简单总结 背景 自从2019年公司转向java技术路线. 一直断断续续的在学习java相关的技术内容. 但是总感觉学的不是很深入. 这周比较累.也不想在学新东西了. 所以想着再总结一下jcm ...

  6. 大数据面试题集锦-Hadoop面试题(三)-MapReduce

    你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案.如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料. 目录 ...

  7. 栈:数据结构中的后进先出(LIFO)容器

    栈是一种基本的数据结构,广泛应用于计算机科学和编程中,用于管理数据的存储和访问.栈遵循后进先出(Last In, First Out,LIFO)原则,即最后放入栈的元素首先被取出.这种数据结构模拟了物 ...

  8. 从零开始匹配vim(0)——vimscript 简介

    通过之前一系列的文章,相信各位小伙伴应该已经对vim产生了浓厚的兴趣,可能不少小伙伴通过慢慢的使用变的跟我一样,离开vim就不会写代码了.如果你希望继续长时间使用vim,甚至将vim作为主要的代码编辑 ...

  9. TienChin 创建菜单页面

    上一节当中我们只是给后台添加了对应的菜单,实际上对应的页面还没有存在这节主要就是创建出来页面: 促销活动: activity 统计分析: analysis 商机管理: business 渠道管理: c ...

  10. 疾速7600MT/s!KELVV科赋CRAS V RGB DDR5内存图赏

    12月18日消息,KLEVV科赋日前推出新款大容量DDR5内存套装,满足游戏玩家.内容创作者和高端PC爱好者的需求. 现在,KLEVV科赋CRAS V RGB内存套装已经来到我们评测室,下面为大家带来 ...