什么时候要重写equals

当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashCode也同时需要被重要,一般来说就是对类里所有成员变更求hashCode。

没有重写equals时

一个类型Demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因为它们的引用地址不相同。(
默认情况下,equals和==是一样的,比较引用类型的内存地址)

需要根据值比较相等时要重写它们
class Demo { private String name; private String email; public String
getEmail() { return email; } public void setEmail(String email) { this.email =
email; } public String getName() { return name; } public void setName(String
name) { this.name = name; } @Override public boolean equals(Object o) { if
(this == o) return true; if (o == null || getClass() != o.getClass()) return
false; Demo demo = (Demo) o; return Objects.equals(name, demo.name) &&
Objects.equals(email, demo.email); } @Override public int hashCode() { return
Objects.hash(name, email); } }
在生成多字段的hashCode时,使用了类型的Objects.hash这个方法,它的源码如下
public static int hashCode(Object a[]) { if (a == null) return 0; int result
= 1; for (Object element : a) result = 31 * result + (element == null ? 0 :
element.hashCode()); return result; }
使用单元测试校验结果
@Test public void hashcode() { Demo demo1 = new Demo(); demo1.setName("zzl");
Demo demo2 = new Demo(); demo2.setName("zzl");
Assert.assertEquals(demo1.getName().hashCode(), demo2.getName().hashCode());
Assert.assertEquals(demo1.hashCode(), demo2.hashCode()); }

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信