Java 的 equal 和 hashcode 是相親相愛的一對
請看一下這單身狗的待遇吧,男單身狗的待遇。
public class EqualTest {
private String Odd, even;
public EqualTest(String Odd, String even) {
this.Odd = Odd;
this.even = even;
}
public boolean equals(Object o) {
if (!(o instanceof EqualTest))
return false;
EqualTest n = (EqualTest)o;
return n.Odd.equals(Odd) && n.even.equals(even);
}
/*
public int hashCode() {
return 32 * Odd.hashCode() + even.hashCode();
}
*/
public static void main(String[] args) {
Set<EqualTest> s = new HashSet<>();
s.add(new EqualTest("sigle", "couple"));
System.out.println(s.contains(new EqualTest("sigle", "couple")));
}
}
// 輸出
false
女單身狗待遇:
public class EqualTest {
private String Odd, even;
public EqualTest(String Odd, String even) {
this.Odd = Odd;
this.even = even;
}
/*
public boolean equals(Object o) {
if (!(o instanceof EqualTest))
return false;
EqualTest n = (EqualTest)o;
return n.Odd.equals(Odd) && n.even.equals(even);
}
*/
public int hashCode() {
return 32 * Odd.hashCode() + even.hashCode();
}
public static void main(String[] args) {
Set<EqualTest> s = new HashSet<>();
s.add(new EqualTest("sigle", "couple"));
System.out.println(s.contains(new EqualTest("sigle", "couple")));
}
}
// 輸出
false
虐狗一對出現:
public class EqualTest {
private String Odd, even;
public EqualTest(String Odd, String even) {
this.Odd = Odd;
this.even = even;
}
public boolean equals(Object o) {
if (!(o instanceof EqualTest))
return false;
EqualTest n = (EqualTest)o;
return n.Odd.equals(Odd) && n.even.equals(even);
}
public int hashCode() {
return 32 * Odd.hashCode() + even.hashCode();
}
public static void main(String[] args) {
Set<EqualTest> s = new HashSet<>();
s.add(new EqualTest("sigle", "couple"));
System.out.println(s.contains(new EqualTest("sigle", "couple")));
}
}
// 輸出
true
追根究底
hashcod約定
When overriding equals() in a class, the hashCode() method should be overrided as well such that it maintains its contract with equals().
簡單說:hashCode 約定要求相等的對象要具有相同的散列碼。爲了遵守這項約定,無論何時,只要你覆寫了equals 方法,你就必須同時覆寫 hashCode 方法。
簡單來說如果兩個對象equals相等,則它們的hashcode必須相等,而hashcode相等,equals則不一定相等。原因在於,前面我們說過hashCode是儘量保證唯一,儘量平均分佈,但由於不可避免地會存在哈希值衝突的情況,此時兩個對象即便hashCode相等,equals也不一定相等,而equals相等hashCode必定相等是因爲,對象的內容相等而根據對象內容生成的hashCode當然也是相等的了。