一旦你比較兩個對象,你必須考慮所有類的成員。
我們假設我們有一個名爲乙,並與兩個成員變量年齡和名類。
B類:
public class B {
String name;
int age;
public B(String name, int age) {
this.age = age;
this.name = name;
}
}
然後讓使用被從Object類繼承我們的B類equals
和hashcode
方法比較同一類的兩個不同的對象。
A級比較:
public class A {
public static void main(String args[]){
B b1 = new B("a", 22);
B b2 = new B("a",22);
System.out.println(b1.equals(b2));
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());
}
}
只要我們編譯和運行A級,我們將得到以下外看跌期權。
false
705927765//returns int value
366712642//returns int value
但這裏的A類已通過相同的參數給乙的兩個對象。這意味着我們得到了我們沒想到的,因爲equals
和hashcode
方法在對象類沒有做我們需要的。 因此,在這種情況下,我們必須在我們的B類中重寫這些方法以使其成功。
B類覆蓋完成後:
public class B {
String name;
int age;
public B(String name, int age) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object obj) {
boolean flag = false;
if (obj instanceof B) {
B b = (B) obj;
if (this.age == b.age) {
if (this.name.charAt(0)==b.name.charAt(0))) {
flag = true;
} else {
flag = false;
}
} else {
flag = false;
}
} else {
flag = false;
}
return flag;
}
@Override
public int hashCode() {
return this.age+this.name.charAt(0);
}
}
如果我們運行A級再次,我們可以得到follwing結果:
true
119
119
這意味着我們的工作就完成了。
我可能會讓'Person'' final'或者'equals'和'hashCode'' final'使得不可能子類Person並違反對稱性。 –
@Chris Jester-Young♦謝謝你的幫助!你介意解釋爲什麼我們需要重寫後的哈希碼?我仍然是編程新手。 –
@ R.DM當使用對象作爲散列鍵時使用散列碼。散列碼的「契約」是相同的對象(所有對象'a'和'b',其中'a.equals(b)'返回true)必須具有相同的散列碼。如果你不重寫'hashCode',默認的哈希碼就是「身份哈希碼」,即使它們使用equals來比較相等的值,每個對象也是不同的。這就是爲什麼'hashCode'和'equals'完全相同的字段比較重要。 –