天天看點

java程式設計思想:判斷兩個對象内容是否相等

“==”與equals方法的差別

“a==b”:(本質是比較兩側變量a、b内的内容)

  • a、b為基本資料類型時,a、b記憶體放的是具體的數字,故比較的是兩個數的具體數值(即比較變量a、b記憶體放的内容)
  • a、b為兩個對象的引用時,a、b記憶體放的是某對象的位址,故比較的是對象的位址

equals方法:

  • equals方法存在于Object類之中,所有類中的equals方法都繼承自Object類。
  • 預設的equals方法的底層還是判斷“a==b”,故沒有在類中重寫equals方法時,比較的也是對象a、b的位址
  • 在java提供的所有類中,絕大多數都重寫了equals方法 ,重寫equals方法後一般比較兩個對象的内容
  • 若需要實作自定義類的兩個對象的内容是否相等,需要自主重寫 equals方法
  • 重寫equals方法時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。

自定義的類的對象内容是否相等

  • equals方法的重寫

重寫equals方法使得邏輯上姓名相同的兩個對象被判定為相等的對象

public boolean equals(Object obj) {
    //利用instanceof 方法,判斷obj是否是Name的執行個體,是則傳回True
    if(obj instanceof Name){
        Name name=(Name)obj;//把obj對象強行轉換成Name類
        return (firstname.equals(name.firstname))&&(lastname.equals(name.lastname));
        //實際上比較this.fisrtname和傳入的name.firstname;使用并集兩者都相等時才傳回
    }
    return super.equals(obj);
    //obj不是Name的執行個體時,調用父類Object的equals方法,比較this和傳入的obj類
}
           
  • hashCode方法的重寫

預設情況下,hashCode方法是将對象的存儲位址進行映射

public int hashCode(){
    return firstname.hashCode();
    //firstname為字元串類,字元串重寫hashCode()方法,直接傳回哈希值即可
}
           

繼續閱讀