重写equals和hashcode

一、等价性equals()和==

       (1)equals()和==的区别:

         “==” 运算符用于比较两个对象的引用是否指向相同的内存地址,也就是比较它们是否是同一个对象的实例。而 equals() 方法是用来比较对象的内容是否相等,通常是在类中进行重写以实现自定义的相等性比较逻辑。

总的来说,== 比较的是对象的引用,而 equals() 比较的是对象的内容。

默认的equals()方法是用来比较对象的引用,也就是说它的行为与==运算符是一样的。

故需要对equals()进行重写

即 “==”à引用等价性(判断地址),equals()à对象等价性(判断内容)

同时,在自定义ADT时,需要重写Object的equals()

对基本数据类型,使用==判定相等;对对象类型,使用equals()判断相等

二、重写equals()函数

             

解读:

       第一个if首先检查当前对象 (this) 是否与传入的对象 (obj) 是同一个对象(引用相同),若相同则返回true。

       第二个if,首先检查传入的对象 obj 是否为 null。然后检查当前对象的类是否与传入对象的类相同,这里使用 getClass() 方法而不是 instanceof 关键字,因为 instanceof 检查的是继承关系,而 getClass() 检查的是对象是否是确切的同一个类。这意味着即使子类对象传入,比较也会返回 false

    最后对字符进行比较,obj 强制类型转换为 MyClass 类型,因为在前面已经确保了 obj 和当前对象是同一个类,比较两个对象的 value 字段。如果它们的 value 相等,返回 true,否则返回 false

或者

三、重写hashCode()函数

        为什么要重写equals()函数后必须重写hashCode()函数?

       如果只重写equals()而不重写hashCode(),会导致在基于哈希的数据结构中(如HashSetHashMap)出现意想不到的行为。即使两个对象是相等的(根据equals()),它们可能会被存储在不同的桶中,因为默认的hashCode()方法是基于对象的内存地址生成的。

  1. 可变类型/不可变类型

观察等价性:在不改变状态的情况下, 两个 mutable 对象是否看起来一致 (某一时刻两者是否相同)

行为等价性:调用对象的任何方法都展示出一致的结果

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值