什么時候(hou)要重(zhong)寫equals
什么時候要重寫equals
當對(dui)象需(xu)要(yao)根據值去(qu)比較它們(men)(men)是否相等時(shi),需(xu)要(yao)我們(men)(men)重(zhong)寫equals,而它的hashCode也同時(shi)需(xu)要(yao)被重(zhong)要(yao),一般來說就是對(dui)類(lei)里所(suo)有成員變更求(qiu)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);
}
}
在(zai)生成多字段的(de)hashCode時,使用了類型的(de)Objects.hash這(zhe)個方法,它的(de)源(yuan)碼(ma)如下
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());
}