为什么重写了equals也要重写hashCode

在中第九条规定在覆盖方法时总要覆盖方法。这是为什么呢?接下来我们就介绍一下这两个方法。

Java中的方法和方法都是在类中的方法,而在Java中所有的类都是类的子类,所以Java中所有的方法都会有这两个方法的默认实现。

equals方法

类中的方法定义如下

我们发现在方法中就关键的,那么在Java中有什么含义呢,我们都知道在Java中分为基本数据类型和引用数据类型。那么在这两个类型中作用是不一样的。

基本数据类型:比较的是两边值是否相等

引用数据类型:比较的是两边内存地址是否相等

基本数据类型包括:,,,,,,,

而通过Java文档中的方法描述,所有要实现自己的方法都要遵守下面几个规则

自反性:对于任何对象x,应该返回

对称性:对于任何两个对象x和y,如果返回,那么也应该返回

传递性:对于多个对象x,y,z,如果返回,返回,那么也应该返回

一致性:对于两个非空对象x,y,在没有修改此对象的前提下,多次调用返回的结果应该相同

对于任何非空的对象x,都应该返回

hashCode方法

中的方法是一个本地方法,返回一个类型的哈希值。

在方法中也有一些规约

如果对象在使用方法中进行比较的参数没有修改,那么多次调用一个对象的方法返回的哈希值应该是相同的。

如果两个对象通过方法比较是相等的,那么要求这两个对象的方法返回的值也应该是相等的。

如果两个对象通过方法比较是不同的,那么也不要求这两个对象的方法返回的值是相同的。但是我们应该知道对于不同对象产生不同的哈希值对于哈希表(HashMap等等)能够提高性能。

equals方法和hashCode方法会在哪用到

这两个方法经常出现在Java中的哪个类里面呢?如果看过源码的应该了解这两个方法经常出现在中。网上介绍类的文章有很多了,这里就简单介绍一下。

当一个节点中的链表超过了8的时候就会变为红黑树,以解决链表长度过长以后查询速度慢的缺点。

是由数组和链表组成的高效存储数据的结构。那么是如何确定一个数据存储在数组中的哪个位置呢?就是通过方法进行计算出存储在哪个位置,还记得我们上面讲方法说了有可能两个不同对象的方法返回的值相同,那么此时就会产生冲突,产生冲突的话就会调用方法进行比对,如果不同,那么就将其加入链表尾部,如果相同就替换原数据。

计算位置当然不是上面简单的一个方法就计算出来,中间还有一些其他的步骤,这里可以简单的认为是确定了位置。

什么时候去覆盖这两个方法呢?

如果你不将自定义的类定义为的key值的话,那么我们重写了方法而没有重写方法,编译器不会报任何错,在运行时也不会抛任何异常。

如果你想将自定义的类定义为的key值得话,那么如果重写了方法那么就必须也重写方法。

接下来我们可以看一下我们使用自定义的类作为的key,并且自定义的类不重写和方法会发生什么。

自定义的类

接下来我们看使用自定义的类作为key

我们可以看到程序最后打印的是一个值。原因正如上面我们说的一样。

:用来计算该对象放入数组中的哪个位置,因为是两个都是new的对象,所以即使里面的值一样,但是对象所处的地址却不同,所以使用默认的也就不同,当然在中就不会认为两个是一个对象。

接下来我们就重写一下这两个方法。如果我们使用的话,那么直接使用快捷键即可。

接下来我们看我们实现的两个方法

然后我们再次运行上面的程序发现输出打印已经变成了。

我们也能够使用提供的注解简化代码

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191129A04DF000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券