equals和hashCode 面試題

2021-09-27 12:01:28 字數 2679 閱讀 2010

1:建立學生實體類並手寫equals和hashcode方法

public class studenta 

public studenta(string name)

public boolean equals(object o)

if(o==null || this.getclass()!=o.getclass())

studenta studenta = (studenta) o;

return this.age==studenta.age

&& this.name.equals(studenta.name)

&& (this.***==null?"":this.***).equals(studenta.***)

&& this.hascar==(studenta.hascar);

}public int hashcode()

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

public string get***()

public void set***(string ***)

public boolean ishascar()

public void sethascar(boolean hascar)

}

1:測試hashcode方法和equals方法

理論一: hashcode不相同,兩個物件就不相同
public class teststudent 

}

理論一輸出: 

studenta1物件的hashcode值:775648362

studenta2物件的hashcode值:775082333

比較物件:false

理論二: hashcode相同,兩個物件不一定相同
public class teststudent 

}

理論二輸出: 

studenta1物件的hashcode值:775082333

studenta2物件的hashcode值:775082333

比較物件:false

理論三: equals相同,hashcode一定相同,兩個物件一定相同
public class teststudent 

}

理論三輸出:

studenta1物件的hashcode值:776548788

studenta2物件的hashcode值:776548788

比較物件:true

2:特殊hashcode方法和equals方法(自定義需求,如果名字相同的兩個物件認為是同乙個人)

public class studenta 

public studenta(string name)

public boolean equals(object o)

if(o==null || this.getclass()!=o.getclass())

studenta studenta = (studenta) o;

return this.name.equals(studenta.name);

}public int hashcode()

}

3:特殊hashcode方法和equals方法測試

public class teststudent 

}

studenta1物件的hashcode值:805606

studenta2物件的hashcode值:805606

比較物件:true

1:通過分析object的equals方法,能夠看到object中equals比較的是位址值,如果在子類中不覆寫equals,就會呼叫父類object中的equals方法,因比較記憶體位址值而導致兩個物件不等,但是在實際開發中存在兩個不同的實體,在業務邏輯上是相同的,如果不覆寫equals,不足以滿足開發條件

2:覆寫了equals方法,必須覆寫hashcode,因為「相等的物件必須具有相等的雜湊碼」

注意點:比較兩個物件先判斷hashcode值,當hashcode值相同才會去比較equals,如果hashcode值不相同,直接返回false,不會去比較equals

注意點:equals是絕對的,hashcode是輔助條件

結論:①:如果兩個物件的equals是相同的,那麼他們的hashcode也是相同的

②:如果兩個物件的equals不相同,那麼他們的hashcode有可能是相同的

③:如果兩個物件的hashcode是相同的,兩個物件不一定是相同的

④:如果兩個物件的hashcode不相同,兩個物件一定不相同

equals和hashcode的重寫

下面給出例項 package xuming class student public student string name,int age,int classnum 重寫equals方法 public boolean equals object o 測試引用o是都為null if o null 測...

equals 和hashCode 的區別

equals 反映的是或變數具體的值,即兩個物件包含的值 可能是物件的引用,也可能是值型別的值 hashcode 計算出物件例項的雜湊碼 根據記憶體位址返回的int型的數值 並返回雜湊碼,又稱為雜湊函式。根據object的hashcode都是唯一的 當然,當物件重寫了hashcode 方法時,結果就...

equals 和hashCode 使用總結

equals package cn.galc.test public class testequals 沒有重寫equals class cat 先判斷比較物件是否為null 判斷比較物件是否為要比較類的例項 比較倆個成員變數是否完全相等。public class testequals 重寫equa...