美文网首页
Java中重写equals方法为什么要重写hashcode方法?

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

作者: 雄关漫道从头越 | 来源:发表于2020-06-17 12:01 被阅读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方法,再比较

测试类

依次输出

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

相关文章

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

    Java中重写equals方法为什么要重写hashcode方法?(转) == 与 equals的区别 如果两个引用...

  • Java 比较相等

    Java Equals() 特性 Equals() 和 == 的区别 重写Equals方法 重写HashCode方法

  • hashcode

    JAVA中重写equals()方法的同时要重写hashcode()方法 object对象中的 public boo...

  • hashCode 与 equals

    “你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha...

  • 第三章所有对象的通用方法

    目录 重写equals方法时遵守通用约定 重写equals方法时同时也要重写hashcode方法 始终重写 toS...

  • EffectiveJava笔记[三]

    11、重写equals时重写hashCode方法 在每一个重写了equals方法的类中,应当重写这个类的hashC...

  • 53 HashMap8 源码解读

    1,为什么重写equals还要重写hashcode方法hashcode方法:底层采用c语言编写的,根据对象内存地址...

  • 为什么重写equals()方法,必须重写hashCode()方法

    为了弄清为什么重写equals()方法时,必须重写hashCode()方法,我们首先需要明确Object实现has...

  • Object类

    找对象的方式: Object 类: java规范:一般我们再重写equals方法的时候,我们都会重写hashCode方法

  • 2018-05-16

    Linux的epoll机制? 为什么重写equals时必须重写hashCode方法? 微服务调用链? http:/...

网友评论

      本文标题:Java中重写equals方法为什么要重写hashcode方法?

      本文链接:https://www.haomeiwen.com/subject/wiojxktx.html