Java中重写equals方法为什么要重写hashcode方法?

2020-06-17  本文已影响0人  雄关漫道从头越

Java中重写equals方法为什么要重写hashcode方法?(转)

== 与 equals的区别

如果两个引用类型变量使用==运算符,那么比较的是地址,它们分别指向的是否是同一地址的对象。结果一定是false,因为两个对象不可能存放在同一地址处。要求是两个对象都不是能空值,与空值比较返回false。==不能实现比较对象的值是否相同。所有对象都有equals方法,默认是Object类的equals,其结果与==一样。如果希望比较对象的值相同,必须重写equals方法。hashCode与equals的区别

Object中的equals:

equals 方法要求满足:

自反性 a.equals(a)对称性 x.equals(y) y.equals(x)一致性 x.equals(y) 多次调用结果一致对于任意非空引用x,x.equals(null) 应该返回falseObject中的hashCode:

它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置。

当equals方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规约定:值相同的对象必须有相同的hashCode。object1.equals(object2)为true,hashCode也相同;hashCode不同时,object1.equals(object2)为false;hashCode相同时,object1.equals(object2)不一定为true;当我们向一个Hash结构的集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则链到后面(如果是链地址法)。

先调用hashCode,唯一则存储,不唯一则再调用equals,结果相同则不再存储,结果不同则散列到其他位置。因为hashCode效率更高(仅为一个int值),比较起来更快。

HashMap#put源码

hash是key的hash值,当该hash对应的位置已有元素时会执行以下代码(hashCode相同)

如果equals返回结果相同,则值一定相同,不再存入。

如果重写equals不重写hashCode会怎样

两个值不同的对象的hashCode一定不一样,那么执行equals,结果为true,HashSet或HashMap的键会放入值相同的对象。

话不多说,直接上例子,~~~

首先我们只重写equals()方法

看我们的测试类

依次输出

是否出现矛盾???用equals比较说明对象相同,但是在HashMap中却以不同的对象存储(没有重写hascode值,两个hascode值,在他看来就是两个对象)。到底这两个对象相等不相等????说明必须重写hashCode()的重要性,

接下来重写重写equals方法和hashCode方法,再比较

测试类

依次输出

看到这里,同学 你懂了吗?还不懂,可以自己实现一遍代码。

上一篇下一篇

猜你喜欢

热点阅读