什么時候要重寫equals
什么時候要重寫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());
}
浙公網安備 33010602011771號