关于idea生成equals()和hashCode()时两个类型匹配检查表达式的分析

请添加图片描述
官方解释如下:
在这里插入图片描述

instanceofgetClass()
允许子类实例与父类相等
允许不同子类的示例相互相等
重写生成的 equals 方法不违反其约定
避免额外的空检查
遵守Liskov替换原则(LSP)

注:Liskov替换原则(LSP)是一种面向对象编程的基本原则,它要求派生类(子类)对象能够替换其基类(父类)对象被使用,而程序逻辑不受影响。
要点如下:
① instanceof 表达式允许子类与父类对象进行比较,适用于希望支持多态性比较的场景,即允许子类对象与父类对象“相等”(如果子类没有增加新的字段,并且希望继承父类的相等性判断逻辑。如果子类添加了新的字段,并且没有重写equals()方法判断这些新字段,那么使用instanceof会导致判断不符合预期)。
② getClass()方法返回对象的运行类型。在equals()方法中使用getClass()比较表达式,实际上是比较两个对象的运行类型和对象是否完全相同。只有当两个对象属于同一个类且字段相同时,才认为它们相等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,要实现对象相等比较,需要重写equals()和hashCode()方法。 equals()方法是用来比较两个对象是否相等的,它的默认实现是比较两个对象的引用地址。如果要比较两个对象的值是否相等,需要重写equals()方法。在重写equals()方法,需要满足以下条件: 1. 对称性:如果a.equals(b)返回true,那么b.equals(a)也应该返回true。 2. 自反性:任何对象和自己比较,都应该返回true,即a.equals(a)应该返回true。 3. 传递性:如果a.equals(b)返回true,b.equals(c)也返回true,那么a.equals(c)也应该返回true。 4. 一致性:如果a.equals(b)返回true,在a和b没有改变的情况下,多次调用a.equals(b)应该返回true。 5. 非空性:任何对象和null比较,都应该返回false,即a.equals(null)应该返回false。 hashCode()方法是用来返回对象的哈希码的,它的默认实现是返回对象的引用地址的哈希码。如果要使用对象的值作为哈希码,也需要重写hashCode()方法。在重写hashCode()方法,需要满足以下条件: 1. 如果a.equals(b)==true,那么a.hashCode()==b.hashCode()也应该成立。 2. 如果a.equals(b)==false,那么a.hashCode()和b.hashCode()尽量不要相同,以提高哈希表的效率。 下面是一个实现equals()和hashCode()方法的示例: ```java public class Person { private String name; private int age; // 构造方法、getter和setter方法省略 @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Person)) { return false; } Person other = (Person) obj; return Objects.equals(name, other.name) && age == other.age; } @Override public int hashCode() { return Objects.hash(name, age); } } ``` 在上面的示例中,equals()方法比较两个Person对象的name和age属性是否相等hashCode()方法使用了Java 7中的Objects类来计算哈希码。注意,在equals()方法中要判断传入的参数是否为null和是否是Person对象,以避免出现NullPointerException和ClassCastException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wistain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值