dabocaiqq
dabocaiqq
2020-05-23 10:16
采纳率: 66.6%
浏览 118

高分悬赏:Java语言equals和hashcode的区别是什么?两个函数都必须编写么?

高分悬赏:Java语言equals和hashcode的区别是什么?两个函数都必须编写么?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2020-06-04 12:24
    已采纳

    Java 的 equals 和 hashCode 是判断对象相等的基础方法,默认使用对象的哈希码来判断对象是否相等,equals 一般可以按业务等的逻辑来实现。
    另外 hashCode 方法涉及到底层地址,不建议自己写,一般用IDE 的自动生成。

    点赞 评论
  • weixin_43965374
    不要忘了它 2020-05-23 11:12

    1) 只要重写 equals,就必须重写 hashCode。 2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写
    这两个方法。
    3) 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和 equals。
    说明:String 因为重写了 hashCode 和 equals 方法,所以我们可以愉快地使用 String 对象作为 key 来使

    点赞 评论
  • m0_46321529
    编程和音乐万一呢 2020-05-23 15:01

    先来看看在顶级父类Object中的源码:

    public native int hashCode();
    
    public boolean equals(Object obj) {
            return (this == obj);
    }
    

    本质上其实是两个不同的方法,equals()返回布尔值,hashCode()返回int值。
    通俗点说:equals用于比较引用对象的值,hashCode返回引用对象的内存地址。
    估计发问者是想知道自己写的类中,是否必须重写这两个方法。
    不重写则无法迅速比较两个对象的某些特性。
    广泛地说:肯定是按照业务逻辑来决定的。
    个人的理解:
    1. 只重写equals方法,但不重写hashCode时:可以使得在调用equals方法时,按照自己想要的逻辑返回比较结果;
    2. 重写hashCode方法,对算法不熟悉的情况下,很容易造成及时每次运行返回的值是一样的(站在JMV的角度,依旧是两个不同的内存地址,但是由于你重写了hashCode方法,返回的hashCode会变成一样的值);
    3. 如果要完整地保留哈希一致性,那不如用Object类的就好,或者你只是想返回自己想返回的hashCode值方便特定业务的实现(如果是这样,这个方法已经可以不用重写hashCode了).

    点赞 评论

相关推荐