Java|Java equals() and hashCode() Contract

小伙伴们注意了!
小编在这里给大家送上关注福利:
搜索微信公众号“速学Java”关注即可领取小编精心准备的资料一份!
Java|Java equals() and hashCode() Contract
文章图片
Java超类Java .lang。对象定义了两个重要的方法:
Java|Java equals() and hashCode() Contract
文章图片
在本文中,我将首先展示一个常见错误的示例,然后解释equals()和hashCode()契约是如何工作的
1. 一个常见的错误
下面的示例显示了常见的错误。
Java|Java equals() and hashCode() Contract
文章图片
在主方法中,创建两个apple(“green”和“red”)并将其放到HashMap中。
然而,当要求地图提供绿苹果时,却没有找到绿苹果。
上面的程序输出null。
在调试器中检查hashMap时,我们确信绿色的apple存储在hashMap中。
Java|Java equals() and hashCode() Contract
文章图片
是什么导致了这个问题?
2. 由hashCode()引起的问题
【Java|Java equals() and hashCode() Contract】这个问题是由未覆盖的方法“hashCode()”引起的。
equals()和hashCode()之间的契约是:
如果两个对象相等,那么它们必须具有相同的哈希码。
如果两个对象具有相同的哈希码,它们可能相等,也可能不相等。
地图背后的理念是能够比线性搜索更快地找到目标。
使用散列键定位对象是一个两步的过程。
在内部,HashMap被实现为一个条目对象数组。
每个条目都有一个对和一个指向下一个条目的指针。
key对象的哈希码是数组寻址的索引。
这将定位数组单元格中的项的链表。
然后使用equals()线性搜索单元格中的链表,以确定两个对象是否相等。
对象类中的hashCode()的默认实现为不同的对象返回不同的整数。
因此,第二个苹果有一个不同的哈希码。
HashMap的组织方式类似于bucket序列。
关键对象被放入不同的桶中。
需要花费O(1)的时间才能到达正确的bucket,因为它是一个带有索引的数组访问。
因此,将对象均匀地分布到这些桶中是一个很好的实践,即
方法生成均匀分布的散列代码。
(但不是这里的重点)
解决方案是将hashCode方法添加到Apple类中。
这里我只使用颜色字符串的长度来演示。
Java|Java equals() and hashCode() Contract
文章图片
最后,想学习Java的小伙伴们!
关注“速学java”公众号就可以拿到一份我为大家准备的Java学习资料!
对Java感兴趣的小伙伴也可以加 小编V?: suxuejava
Java|Java equals() and hashCode() Contract
文章图片

    推荐阅读