當對象須要根據值去比較它們是否相等時,須要咱們重寫equals,而它的hashCode也同時須要被重要,通常來講就是對類裏全部成員變動求hashCode。ide
一個類型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()); }