lombok中注解@EqualsAndHashCode的坑

问题现象:使用了@EqualsAndHashCode注解的类,实例化出两个对象,这两个对象有多个属性,他们不完全相同,但这两个对象的hashcode却是一样的,equals方法也是表明两者相同,百思不得其解。

示例如下:

//@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集

//父类
@Data
public class Parent {
    private String id;
}
//子类
@Data
public class Child extends Parent {
    private String name;
}
//测试
@Test
    void test(){
        Child child1 = new Child();
        child1.setName("小明");
        child1.setId("123");

        Child child2 = new Child();
        child2.setName("小明");
        child2.setId("456");

        System.out.println("child1的hash值:"+child1.hashCode());
        System.out.println("child2的hash值:"+child2.hashCode());
        System.out.println("child1和child2是否相等:"+child2.equals(child1));
    }

输出结果:

child1的hash值:756762
child2的hash值:756762
child1和child2是否相等:true

在我们看来,child1和child2的name虽然相同,但id不同,那他们的hashcode应该不一样,也应该不相等才对;但现实和我们想的恰恰相反,这是因为:@EqualsAndHashCode注解默认是不添加父类属性的

所以如果继承父类时候使用@Data需要加上
@EqualsAndHashCode(callSuper = true),如下:

@Data
@EqualsAndHashCode(callSuper = true)
public class Child extends Parent {
    private String name;
}

再执行上面的测试方法,输出结果如下:

child1的hash值:3632894
child2的hash值:3808655
child1和child2是否相等:false

这才是我们所期望的结果。

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页

打赏作者

想养一只雪狐

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值