Java中为什么重写equals()也需要重写hashCode()?

这篇具有很好参考价值的文章主要介绍了Java中为什么重写equals()也需要重写hashCode()?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

所有类默认继承Object类 先看一下Object源码

package java.lang;
public class Object {
	//默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突
	public native int hashCode();
	//默认调用的equals方法比较的是'=='比较
	//基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同
	public boolean equals(Object obj) {
		return (this == obj);
    }
}

结论

  • equals()返回结果为true hashCode()一定相同
  • '=='结果为true hashCode()一定相同
  • '=='结果为false hashCode()有可能相同(哈希冲突)

hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值

回到刚刚哪个问题 为什么重写equals还要重写hashCode()?文章来源地址https://www.toymoban.com/news/detail-425053.html

public class per {
    private String name;
    private int age;
    public per(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public boolean equals(Object o){
        if (this==o)return true;
        if (o==null||o.getClass()!=this.getClass())return false;
        per o1 = (per) o;
        return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age;
    }
    public int hashCode(){
        return Objects.hash(name,age);
    }
	/*
	这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致!
	例如HashMap无法保证key值'唯一性'
	下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的
	所以应该只用一个key表示 但是不重写将无法正确插入!
	*/
}
class Example{
    public static void main(String[] args) {
        per p1 = new per("张三", 18);
        per p2 = new per("张三", 18);
        HashMap<per,Integer> map = new HashMap<>();
        map.put(p1,1);
        map.put(p2,2); //具体原理可以看put(k,v)源码!
    }
}

到了这里,关于Java中为什么重写equals()也需要重写hashCode()?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中的equals和hashCode

    目录 equals hashCode equals和hashCode之间的关系 总结 equals方法是Object类中用于检测两个对象是否相同的方法,Object类中实现的是两个对象引用是否相同的方法,看以下Object类中代码: 可以看出来,Object类中equals方法本质上比较的还是两个对象的引用是否相同。也就是比较一个对象

    2024年02月06日
    浏览(67)
  • 【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章主要是为了解答有关多态的那篇文章那块的一个奇怪现象,大家还记得这张

    2024年02月19日
    浏览(27)
  • java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别

    两个对象的hashCode()相同时,equals()相等吗?_两个对象的hashcode一样,equal一样么_不想当个程序员的博客-CSDN博客 equals():比较的是非基本类型的数据的引用地址(即内存地址)是否相同,但是对于重写equals方法的类型,比较的是对象内容是否相同。 hashCode():计算对象实例的哈

    2024年02月12日
    浏览(35)
  • 为什么需要websocket?

    前端和后端的交互模式最常见的就是前端发数据请求,从后端拿到数据后展示到页面中。如果前端不做操作,后端不能主动向前端推送数据,这也是http协议的缺陷。        因此,一种新的通信协议应运而生---websocket,他最大的特点就是服务端可以主动向客户端推送消息,客

    2024年02月12日
    浏览(44)
  • 为什么需要单元测试?

    为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言,功能测试和系统测试以及其他性能测试等等对测试

    2024年02月12日
    浏览(54)
  • 为什么需要uboot?

    bootROM: 一种固化在芯片内部的只读存储器(ROM),用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码,用于完成系统启动前的基本初始化和配置, 例如初始化时钟、GPIO控制器、中断控制器、存储设备(SD卡、NAND Flash、SPicy Flash)等硬件资源, 检测启动设备

    2023年04月23日
    浏览(50)
  • 为什么需要数据仓库

    为什么不在OLTP环境下分析?  OLTP环境也会存储历史数据,但这些历史数据并不是业务运行所需的,这些历史数据需要经常归档到数据仓库,并且在OLTP数据库中删除。 相比之下,事务环境适用于连续处理事务,通常应用于订单录入以及财务和零售事务。它们并不依赖历史数据

    2024年01月25日
    浏览(53)
  • 为什么需要超时控制

    本文将介绍为什么需要超时控制,然后详细介绍Go语言中实现超时控制的方法。其中,我们将讨论 time 包和 context 包实现超时控制的具体方式,并说明两者的适用场景,以便在程序中以更合适的方式来实现超时控制,提高程序的稳定性和可靠性。 超时控制可以帮助我们避免程

    2024年02月03日
    浏览(43)
  • 为什么需要对相机标定?

    以下内容来自系统教程如何搞定单目/鱼眼/双目/阵列 相机标定? 点击领取相机标定资料和代码 为什么需要对相机标定? 我们所处的世界是三维的,而相机拍摄的照片却是二维的,丢失了其中距离/深度的信息。从数学上可以简单理解为,相机本身类似一个映射函数,其将输

    2024年02月06日
    浏览(42)
  • 爬虫为什么需要ip

    爬虫需要使用爬虫ip主要是为了解决以下问题: 1、反爬虫机制:许多网站会设置反爬虫机制来防止爬虫程序的访问,例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制,使得爬虫程序更难被检测到。 2、访问限制:有些网站可能会对某些地区的IP地址

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包