首页 > 其他分享 >equals方法和hashcode方法为什么说要一起重写?

equals方法和hashcode方法为什么说要一起重写?

时间:2024-12-31 14:26:58浏览次数:3  
标签:存储 对象 重写 equals hashcode 方法

两种方法的作用

hashcode用于快速定位位置,equals用于确保将要存储的对象与原对象是否相同

实现规则

对于一个使用hashcode方式存储的集合或者列表来说,同一个对象只能存在一个位置,不能出现在不同位置出现相同对象的情况,对象的equals比较结果和hashcode值应该保持一种统一的关系,即两个相等的对象其hashcode值也应保持一致。

默认方法介绍

默认的equals方法是根据内存地址的不同来判断两个对象是否相等。

默认的hashcode方法一般情况下也认为是根据内存地址的来进行hash运算的。也有说是使用的是随机数来进行的生成,这个依据jvm的具体实现不同有所区别。

对于重写equals或hashcode方法

对于依赖hashcode方法的集合实现,如HashMap、HashSet

只重写hashcode方法不重写equals方法的问题是:两个相同对象经过hashcode方法会产生相同的hash值,会被费配到相同的位置进行存储,但因为equals方法没有被重写,默认是按照内存地址来判断两个对象是否相等,而两个对象的内存地址是不会相同的,所以会导致原本相同的两个对象,都被存储进去,从而导致了对象的重复存储。

只重写equals方法不重写hashcode方法会导致的问题是:两个相同的对象,因为内存地址不同,通过默认的hashcode方法,出现的hash值是不相同的,其会被分配到不同的位置存储,所以也会导致两个相同对象的重复存储。

结论:equals方法和hashcode方法最好一起重写,这样能够保证使用集合存储数据是唯一的

欢迎关注微信公众号:空想兔,一起交流学习经验

公众号图片

标签:存储,对象,重写,equals,hashcode,方法
From: https://blog.csdn.net/weixin_47879114/article/details/144849448

相关文章

  • 【Java基础-28】访问修饰符对方法重写的影响:深入解析与最佳实践
    在Java中,方法重写(MethodOverriding)是实现多态性的核心机制之一。通过方法重写,子类可以提供与父类中同名方法的具体实现,从而定制或扩展父类的行为。然而,在方法重写的过程中,访问修饰符(AccessModifiers)的选择对方法的可见性和行为有着重要影响。本文将深入探讨访问修饰符对方......
  • 智能优化揭秘——GaussDB数据库查询重写的自动挖掘与生成
    ​在数据库世界里,查询重写是提升性能的关键环节。WeTune作为一款革命性工具,能自动发现新重写规则,打破现有系统依赖人工发现重写规则的局限,大幅提升数据库查询性能。上海交通大学软件学院副院长王肇国和高斯实验室GaussDB数据库优化器专家Ethan联手开展了一场以《智能优化揭秘—......
  • C中类成员函数的重写、重载和隐藏的区别是什么?
    ###C++中类成员函数的重写、重载和隐藏的区别在C++中,类成员函数的重载、重写和隐藏是三个重要的概念,它们在不同的场景下有着不同的行为和用途。下面将详细解释这三个概念的区别,并给出具体的示例。####1.重载(Overload)**定义**:在同一作用域内,当存在同名成员函数时,如果这些......
  • 方法重写-java se 进阶-day01
    1.方法重写的介绍当子父类中,某方法存在相同的定义(方法名、参数、返回值)时,子类的方法会将父类的方法进行重写操作(覆盖)2.方法重写与方法重载的区别1.方法重载:又称Overload,在同一个类中,方法名相同,参数不同,与返回值无关。其中,参数不同分别为参数类型、参数数量、参数顺序不同2.方......
  • java~重写hashcode时为什么要乘以31
    在Java中,重写hashCode()方法时常常会使用31作为乘数,这是因为31具有一些独特的数学性质,使其成为一个优秀的选择。以下是几个原因:1.奇质数的特性31是一个奇数和质数,这意味着它能有效地减少哈希冲突的概率。使用质数作为乘数可以帮助分散哈希值,从而提高哈希表的性能。2.位运算效......
  • 只谈C++11新特性 - 显式虚函数重写
    显式虚函数重写背景说明在C++11之前,C++的虚函数机制虽然非常强大,但也带来了一些潜在问题。特别是对于大型代码库,当派生类需要重写基类的虚函数时,可能会因为疏忽而引入错误:拼写错误:如果派生类的函数签名不完全匹配基类的虚函数签名,那么派生类的函数并不会覆盖基类的......
  • Java 重写(Override)与重载(Overload)
    重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。在面向对象原则里,重写意味着可以重写任何现有方法。......
  • 14. 有没有可能两个不相等的对象有相同的hashcode
    有可能。在产生hash冲突时,两个不相等的对象就会有相同的hashcode值。当hash冲突产生时,一般有以下几种方式来处理:拉链法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储开放定址......
  • 9. Hashcode的作用
    Java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们中Set中插入的时候怎么判断已经存在该元素呢,可以通过equals方法,但是如果元素太多,用这样的方法就会比较满。于是有人发明了哈希算法来提高集合中查找元素的效率。这种方式将集合分成若干个存储区域......
  • 8. equals与==区别
    ==:==比较的是变量栈内存中存放的对象的堆内存地址,用来判断两个对象的地址是否相同,即是否是指向同一个对象。比较的是真正意义上的指针操作。1.比较的是操作符两端的操作数是否是同一个对象2.两边的操作类必须是同一类型的(可以是父子类之间)才能编译通过3.比较的是地址,如果是具......