您的位置 首页 java

Java之重写equals方法时也要重写hashcode方法

我们在学习 Java 的时候经常看到书本上面写着重写equals方法时也要重写 hashcode 方法,这是为什么呢?今天小编就来探究一下

为什么要重写equals方法呢?

首先,我们可以查看JDK源码,

未重写前的代码是直接用==来判断。这个时候当我们想实现自己的判断对象相等的逻辑的时候,就不可避免的需要重写equals方法。

然而,在重写equals方法时也要准守JDK的规范:

其中一条规范就是:如果两个对象根据equals方法比较结果是相同的,那么调用这两个对象产生的hashcode方法也必须产生相同的结果。即我们也要重写hashcode方法。

一个反例:

定义了一个电话号码类:下面是其成员属性。

为了实现两个对象判断是否相等的逻辑。我们重写了equals方法:判断区号,前缀,还有号码相等,即这两个电话对象相等。

接下来我们自己验证是否正确:

紧接着我们打算从map取出这个人的电话号码,

最后打印结果:

发现取出来是null,与我们预期的想法不同。

  • 原因:

因为这里涉及两个实例:第一个是用于插入到map里面,第二个实例虽然号码本身与第一个实例相等(我们重写了equals方法),但是我们没有重写hashcode方法,查看JDK中 hashmap 的源码可以知道put方法在存放数据时候是根据hashcode值来存放的,在get方法时也是根据hashcode来取数据的,由于这里我们没有重写hashcode方法,导致两个对象实例hashcode值不同,所以取出数据的时候数据为空。

解决方法:重写hashcode方法

一般来说,重写hashcode方法是一个难题,因为要怎么确保每个对象有一个独一无二的hashcode,并且equals相同的对象有相同的hashcode才行,所以怎么取是关键。

下面写一种简单的方法供大家参考,实际运用过程中要根据不同情况灵活改变:

重写完hashcode方法之后,我们重新运行上面的程序:

结果输出kavin ,是我们预期的结果。

至此,我们讲完了为什么在Java编程中重写equals方法为什么要重写hashcode方法了。

如果您喜欢这篇文章,点个赞,支持下小编创作。如果有什么疑问,也可以在评论中与提出,大家一起探讨

文章来源:智云一二三科技

文章标题:Java之重写equals方法时也要重写hashcode方法

文章地址:https://www.zhihuclub.com/187019.shtml

关于作者: 智云科技

热门文章

网站地图