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

equals,hashcode · 浏览次数 : 0

小编点评

在网络上,关于HashMap的get方法的解释虽然全面且深入,但有时会显得枯燥和难以理解。这是因为这些解释往往侧重于技术细节,而不太关注实际应用场景。本文将尝试以更简洁、易于理解的方式解释这一概念,并强调重写equals方法和hashCode方法的重要性。 ### 1. 问题的提出 在Java中,当我们使用HashMap等哈希表数据结构时,我们需要了解其get方法的原理。get方法的作用是在给定的哈希表中查找一个特定的键(key)。为了提高检索效率,我们需要确保在哈希冲突发生时,能够正确地找到目标对象。 ### 2. equals方法的重写 首先,我们需要重写equals方法以确保在比较两个Student对象时,能够正确地识别出它们是否为同一个实例。在重写的equals方法中,我们可以先检查两个对象的引用是否相等,然后比较它们的学号和其他属性。例如: ```java @Override public boolean equals(Object obj) { if (obj instanceof Student) { Student other = (Student) obj; return idCard.equals(other.idCard) && name.equals(other.name) && age == other.age; } return false; } ``` ### 3. hashCode方法的重写 然而,仅仅重写equals方法是不够的。我们还应该重写hashCode方法,以确保在哈希冲突发生时,能够正确地分布对象。在重写的hashCode方法中,我们只需要返回学号的哈希值,因为学号是唯一的: ```java @Override public int hashCode() { return idCard.hashCode(); } ``` ### 4. “约定一致性”的重要性 重要的是要记住,当我们重写equals方法时,我们必须同时重写hashCode方法。这种“约定一致性”的做法可以确保在哈希表中查找和插入元素时,能够高效地找到和操作目标对象。如果只重写了equals方法而没有重写hashCode方法,那么在哈希冲突发生时,get方法可能会返回null,而不是我们期望的目标对象。 ### 5. 结论 总之,为了确保在哈希表中能够高效地查找和操作对象,我们需要重写equals方法和hashCode方法。通过遵循“约定一致性”的原则,我们可以确保在哈希冲突发生时,能够正确地识别和定位目标对象。

正文

网络上解释的很全面但是很枯涩,也有些难懂,其实就是为了保证当该对象作为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方法就能判断是同一个对象了

与面试官:为什么重写equals方法必须要重新hashCode方法?相似的内容:

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

网络上解释的很全面但是很枯涩,也有些难懂,其实就是为了保证当该对象作为key时哈希表的检索效率。如HashMap的get方法是分两步获取的 第一步通过key的哈希值找到对应的哈希桶 第二步通过equals方法来判断是否为同一个key(因为可能出现哈希冲突) 假设一个Student类有三个属性:学号、

上周热点回顾(6.10-6.16)

热点随笔: · 「指间灵动,快码加编」:阿里云通义灵码,再次降临博客园 (博客园团队)· 老生常谈!程序员为什么要阅读源代码? (Yxh_blogs)· 千万级流量冲击下,如何保证极致性能 (Hello-Brand)· 面试官:你讲下接口防重放如何处理? (程序员博博)· C#开发的目录图标更改器

Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?

Spring的IOC(控制反转)是一种设计模式,它允许开发者将对象的创建和管理交给Spring框架来完成。在Spring中,IOC允许开发者将对象依赖关系从代码中分离出来,从而使代码更加灵活、可重用和易于管理。 IoC 全称Inverse of Control(反向控制或控制反转)。 在类和类之间存

深入探讨Java面试中内存泄漏:如何识别、预防和解决

引言 在编写和维护Java应用程序时,内存泄漏是一个重要的问题,可能导致性能下降和不稳定性。本文将介绍内存泄漏的概念,为什么它在Java应用程序中如此重要,并明确本文的目标,即识别、预防和解决内存泄漏问题。 内存泄漏的概念 内存泄漏是指应用程序中分配的内存(通常是堆内存)在不再需要时未能正确释放。这

MySQL面试必备三之事务

本文首发于公众号:Hunter后端 原文链接:MySQL面试必备三之事务 这一篇笔记介绍一下 MySQL 的事务,面试中常被问到关于事务的几个问题如下: 事务是什么 为什么需要事务,事务有什么作用 事务的特点 事务可能带来哪些问题 事务有哪些隔离级别,这些隔离级别都可以解决哪些问题 可重复读隔离级别

为什么你学不会递归?谈谈我的经验

本文已收录到 GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好,我是小彭。 今天分享到计算机科学中一个基础又非常重要的概念 —— 递归。递归是计算机中特有的概念,你

面试官:说说Netty对象池的实现原理?

Netty 作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。 1.什么是对象池技术? 对象池技术是一种重用对象以减少对象创建和销毁带来的开销的方法。在对象池中,只有第一次访问时会创建对象,并将其维护在内存中

qiankun微前端实践

为什么要使用微前端 微前端架构具备以下几个核心价值: 技术栈无关 主框架不限制接入应用的技术栈,微应用具备完全自主权 独立开发、独立部署 微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新 增量升级在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前

这么简单的问题都不会,那还面试什么!?

最近群里的讨论太猛了,硝烟味很重,有的群友直接开怼:这么简单的问题都不会,那你还面试什么呀?我一看这不就是很简单的数组和切片的区别嘛。

MQ消息队列篇:三大MQ产品的必备面试种子题

MQ(Message Queue)作为一种用于实现异步通信的技术,具有重要的作用和应用场景。在面试过程中,MQ相关的问题经常被问到,因此了解MQ的用途和设计原则是必不可少的。本文总结了MQ的常见面试题,包括MQ的作用、产品选型、消息不丢失的保证、消息消费的幂等性、消息顺序的保证、消息的高效读写、分布式事务的最终一致性等方面。通过深入理解这些问题,可以更好地理解MQ的应用和设计,为面试和实际应用提供参考。