[每日一问]---hashCode()和equals()方法的重要性体现在什么地方?

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。
如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此可能会被集合认为是相等的。
而且,这两个方法也用来发现重复元素,所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。


HashMap的很多函数要基于hashCode()方法和equals()方法,hashCode()用来定位要存放的位置,equals()用来判断是否相等。
相等的概念是什么?
Object的equals()只是简单地判断是不是同一个实例,但是有时候我们想要的是逻辑上的相等。比如一个学生类Student,有一个成员变量studentID,只要StudentID相等,不是同一个实例我们也认为是同一个学生。当我们认为判定equals的相等应该是逻辑上的相等而不是只判断是不是内存中的同一个东西的时候,我们就应该重写equals()。而涉及到HashMap的时候,重写了equals()就要重写hashCode()。

总结:
  • 同一个对象(没有发生过修改)无论何时调用hashCode(),得到的返回值必须一样。
  • hashCode()返回值相等,对象不一定相等,通过hashCode()和equals()必须能唯一确定一个对象。
  • 一旦重写了equals(),就必须重写hashCode()。而且hashCode()生成哈希值的依据应该是equals()中用来比较是否相等的字段。如果两个由equals()规定相等的对象生成的hashCode不等,对于HashMap来说,他们可能分别映射到不同位置,没有调用equals()比较是否相等的机会,两个实际上相等的对象可能被插入到不同位置,出现错误。其他一些基于哈希方法的集合类可能也会有这个问题。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,`equals()`和`hashCode()`方法是用于比较对象的两个重要方法。`equals()`方法用于判断两个对象是否相等,而`hashCode()`方法用于返回对象的哈希码。在使用集合类(如HashSet、HashMap等)时,需要重写`equals()`和`hashCode()`方法来确保对象能够正确地被比较和存储。 如果不重写这两个方法,那么默认情况下,比较的是对象的引用,而不是对象的值。这意味着即使对象的属性相同,如果它们的引用不同,它们也会被认为是不相等的。这显然不符合我们的预期。 因此,重写`equals()`和`hashCode()`方法可以确保对象能够正确地被比较和存储,并且能够在集合类中正常工作。在重写`equals()`方法时,需要注意以下几点: - 对称性:如果a.equals(b)返回true,那么b.equals(a)也应该返回true。 - 自反性:a.equals(a)应该返回true。 - 传递性:如果a.equals(b)返回true,b.equals(c)也返回true,那么a.equals(c)也应该返回true。 - 一致性:多次调用a.equals(b)应该返回相同的结果,前提是两个对象没有发生变化。 - 对null的处理:a.equals(null)应该返回false。 在重写`hashCode()`方法时,需要确保: - 如果两个对象相等,它们的hashCode()方法返回的值应该相同。 - 如果两个对象不相等,它们的hashCode()方法返回的值应该尽可能不同,以提高哈希表的性能。 总之,在Java中,重写`equals()`和`hashCode()`方法是程序员必须掌握的基本技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值