首页 > 其他分享 >面试官:为什么重写equals方法必须要重新hashCode方法?

面试官:为什么重写equals方法必须要重新hashCode方法?

时间:2024-06-14 20:10:40浏览次数:24  
标签:面试官 obj String idCard equals hashCode Student

网络上解释的很全面但是很枯涩,也有些难懂,其实就是为了保证当该对象作为key时哈希表的检索效率。如HashMap的get方法是分两步获取的

  • 第一步通过key的哈希值找到对应的哈希桶
  • 第二步通过equals方法来判断是否为同一个key(因为可能出现哈希冲突)

假设一个Student类有三个属性:学号、姓名、年龄,但是只要学号相同我们就认为是同一个学生。这个时候我们重写equals方法

public class Student {
    private String idCard;
    private String name;
    private String age;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            if (this.idCard.equals(((Student) obj).idCard)) {
                return true;
            }
        }
        return false;
    }
}

如果不重写hashCode方法,当从一个Map里通过Student对象作为key检索时,如果只有学号相同而姓名和年龄不同就会导致hashCode大概率不同,那get方法检索时第一步通过hashCode就找不到这个对象,所以就会get为null,但是我们认为学号相同就是同一个对象,我们是想找到这个对象的,这与我们的初衷相违背。

所以我们约定重写equals方法就必须重写hashCode方法,即“约定一致性”

public class Student {
    private String idCard;
    private String name;
    private String age;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            if (this.idCard.equals(((Student) obj).idCard)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.idCard.hashCode();
    }
}

这样get方法第一步就能通过相同的hashCode找到对象,然后再通过equals方法就能判断是同一个对象了

标签:面试官,obj,String,idCard,equals,hashCode,Student
From: https://www.cnblogs.com/GilbertDu/p/18245944

相关文章

  • cglib 代理类自己equals自己 返回false问题
    问题:通过debug发现result.removeAll的时候删不了publicbooleanequals(Objectobj){returnobjinstanceofOspSpringBoot2Initializer.OspBean&&this.bean.equals(((OspSpringBoot2Initializer.OspBean)obj).bean);}this.bean.equals(((OspSpri......
  • 面试官:谈谈对SpringAI的理解?
    SpringAI已经发布了好长时间了,目前已经更新到1.0版本了,所以身为Java程序员的你,如果还对SpringAI一点都不了解的话,那就有点太落伍了。言归正传,那什么是SpringAI?如何快速进行SpringAI开发呢?1.什么是SpringAI?SpringAI是Spring官方社区项目,旨在简化JavaAI应......
  • 创建entity模板,equals hashcode 方法模板
    创建entity模板,equalshashcode方法模板如下为FLINK官网实体类demoequalshashcode方法模板可以参考////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernFlowerdecompiler)//packageorg.apache.flink.walkthrough.common.entity;im......
  • 面试官:你讲下接口防重放如何处理?
    前言我们的API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。我们每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具fd看到请求的URL链接,然后copy出来。这样是非常不安全的,有人可能会恶意的刷我们的接口,那这时该怎么办呢?防重放攻击就出来了......
  • 【== 和 equals 的区别是什么?】
    文章目录一、==和equals()的主要区别?1、定义和性质2、比较的对象3、运行速度4、使用场景二、示例1、基本数据类型比较2、引用类型使用==比较3、引用类型使用equals()比较三、总结一、==和equals()的主要区别?在Java中,==和equals()是两个用于比较对象......
  • 面试官:说说Netty对象池的实现原理?
    Netty作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。1.什么是对象池技术?对象池技术是一种重用对象以减少对象创建和销毁带来的开销的方法。在对象池中,只有第一次访问时会创建对......
  • 面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
    优雅的关闭线程池我们现在步入正题,来看一看在线程池使用完成后如何优雅的关闭线程池。在JDK1.8中,Java并发工具包中java.util.concurrent.ExecutorService提供了shutdown()、shutdownNow()这两种接口方法去关闭线程池,我们分别看一下。shutdown()publicvoidshutdo......
  • Go高阶16,面试官问我go逃逸场景有哪些,我???
    「逃逸分析」就是程序运行时内存的分配位置(栈或堆),是由编辑器来确定的,而非开发者。什么是栈栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO,LastInFirstOut)的顺序,如下图:什么是堆对于堆在内存中的分配,我们可以类比成一个房间,分配内存时,需要找一块足够装下家具......
  • 面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
    写在开头面试官:“小伙子,线程池使用过吗,来聊一聊它吧!”我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问…”面试官满意的点了点头,紧接着问道:“那你知道如何优雅的关闭线程池吗?”我:“知道知道,直接调用shutdownNow()方法就好了呀!”面试官脸色一变,微怒道:“粗......
  • 面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
    写在开头面试官:“小伙子,线程池使用过吗,来聊一聊它吧!”我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问...”面试官满意的点了点头,紧接着问道:“那你知道如何优雅的关闭线程池吗?”我:“知道知道,直接调用shutdownNow()方法就好了呀!”面试官脸色一变,微怒道:“粗鲁!你给......