欢迎光临
我们一直在努力

说一说equals方法和hashCode方法

说一说equals方法和hashCode方法

Java超类Java .lang。对象定义了两个重要的方法:

说一说equals方法和hashCode方法

在这篇文章中,将首先展示一个常见错误的例子,然后解释equals()和hashCode()契约是如何工作的。

一、一个常见的错误

常见的错误如下例所示:

说一说equals方法和hashCode方法

在主方法中,创建两个苹果(“绿色”和“红色”)并放到HashMap中。

然而,当地图被要求提供绿色的苹果时,绿色的苹果没有被找到。

上面的程序打印null。

在调试器中检查hashMap时,我们确信绿色的apple存储在hashMap中。

说一说equals方法和hashCode方法

什么导致了这个问题?

二、hashCode()引起的问题

问题是由未覆盖的方法“hashCode()”引起的。equals()和hashCode()之间的契约是:

如果两个对象相等,那么它们必须有相同的哈希码。

如果两个对象具有相同的哈希码,它们可能相等,也可能不相等。

地图背后的思想是能够比线性搜索更快地找到目标。

使用散列键来定位对象需要两个步骤。

在内部,HashMap实现为一个条目对象数组。

每个条目都有一对和一个指向下一个条目的指针。

键对象的哈希码是对数组寻址的索引。

这将定位数组的该单元格中的项的链接列表。

然后使用equals()线性搜索单元中的链表,以确定两个对象是否相等。

对象类中hashCode()的默认实现为不同的对象返回不同的整数。

因此,第二个苹果有不同的哈希码。

HashMap像bucket序列一样组织。

关键对象被放入不同的桶中。

因为O(1)是带有索引的数组访问,所以需要花费O(1)的时间才能到达正确的bucket。

因此,将对象均匀地分布到这些bucket中是一个很好的实践,具有生成均匀分布的散列代码的hashCode()方法。(这里不是重点)

解决方案是将hashCode方法添加到Apple类中。

这里只是使用颜色字符串的长度来演示。

说一说equals方法和hashCode方法

扩展阅读

JAVA面试题:equals()方法和== 区别

详解equals()方法和hashCode()方法

一次性搞清楚equals和hashCode

java为什么要重写hashCode和equals方法

科普:String hashCode 方法为什么选择数字31作为乘子

细说 Java hashCode

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:英协网 » 说一说equals方法和hashCode方法

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活