美文网首页
equals与hashCode方法

equals与hashCode方法

作者: 一直在路上_求名 | 来源:发表于2020-05-25 00:50 被阅读0次

    两个方法介绍

    equals 方法

    equals 方法是 Object 类自己实现的一个方法,因此每个 Java 类都默认继承了这个方法;可以看到在 Object 类中只是简单的做了 “==” 的判断,所以在没有重写该方法的前提下,equals 实际比较的是两个类的地址,只要不是同一个个类,返回的一定是 false。

    hashCode 方法

    hashCode 方法也是 Object 类的一个方法,返回的是一个int值,每个 Java 类也都默认继承了该方法;但是和 equals 不同的是,他是一个native方法,hashCode 方法返回的是本对象在 jvm 堆上的内存地址的散列值。需要注意的是不同的对象(即“==”返回 false ),哈希值有可能是相等的。

    两个方法的使用

    重写 equals 方法就一定要重写 hashCode?

    对于这个问题我想很多人的答案是肯定的,网上很多博文也是强调必须要一起重写;其实对于这个问题我们是需要分情况的;只有搞清楚他们的作用才能弄清楚为什么要重写,以及是否一定需要重写;

    equals 和 hashCode 什么时候被使用

    我们知道 hashCode 获得的是对象的哈希值,既然要使用到哈希值那肯定离不开哈希表,也就是说只有程序里面使用了类似 HashMap,HashSet,HashTable 等这类集合类时,哈希值才会派上用场。也就是说当程序中没有使用这类结构时,hashCode 这个方法其实是无用的,不会被调用,因此重写也就没有太大意义了。
    而 equals 经常被用来比较两个对象是否相等,在程序里对应相等是有一定的业务属性的,可能需要对象里所有的字段值都相等,也可能只需要某些值相等,又或者只有是同一个对象才能算相等;所以是否重写 equals 需要根据业务来决定。

    重写了equals 还是重写 hashCode 吧!

    其实这个和上面并不矛盾,上文只是根据其用途来说的。而在实际的工作中,由于 hash 表类结构经常被使用,如果重写了 equals 方法了,如果不重写 hashCode 程序就会出问题了。
    因为在哈希表结构中,数据在被添加进去的时候,会先获取对象的哈希值。比如 HashSet 它插入的对应总是不重复的,如果重写了 equals 没有重写 hashCode 当添加数据的时候,获取到对象的哈希值后,发现哈希值不同就当成不同的对象了,就不会再进行 equals 的比较,这个时候 HashSet 中就会存在 equals 相等的重复对象了。
    综上,结合着两个方法的使用场景和具体的用法,当程序中有重写 equals 的需求时,最好还是应该重写 hashCode方法,避免出现一些莫名其妙的错误。

    相关文章

      网友评论

          本文标题:equals与hashCode方法

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