问题现象:使用了@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
这才是我们所期望的结果。