徹底解決 Java中的equals()方法以及與"=="的區別

     在編寫代碼的過程中,我們經常會遇到當前的equals和==之間的使用,但是,爲了弄懂當前的兩者之間的關係,我們將分析Object類中的equals方法 和 String類中的equals方法進行解析。

1、Object 中的equals()方法:
(1)通過查找API,說明如下:
equals
public boolean equals(Object obj)指示其他某個對象是否與此對象“相等”。
equals 方法在非空對象引用上實現相等關係:

自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。
對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。
傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z)
應返回 true。
一致性:對於任何非空引用值 x 和 y,多次調用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals
比較中所用的信息沒有被修改。
對於任何非空引用值 x,x.equals(null) 都應返回 false。
Object 類的 equals 方法實現對象上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,
當且僅當 x 和y引用同一個對象時,此方法才返回 true(x == y 具有值 true)。
注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,
該協定聲明相等對象必須具有相等的哈希碼。

參數:
obj - 要與之比較的引用對象。
返回:
如果此對象與 obj 參數相同,則返回 true;否則返回 false。
public boolean equals(Object obj) {  
        return (this == obj);  
}
2、String中的equals()方法:
(1)通過查找API,說明如下:
equals
public boolean equals(Object anObject)將此字符串與指定的對象比較。
當且僅當該參數不爲 null,並且是與此對象表示相同字符序列的 String 對象時,結果才爲 true。

覆蓋:
類 Object 中的 equals
參數:
anObject - 與此 String 進行比較的對象。
返回:
如果給定對象表示的 String 與此 String 相等,則返回 true;否則返回 false。
     public boolean equals(Object anObject) {

   if (this == anObject) {

                  // 如果當前對象和傳進來要進行比較的對象anObject是同一個對象(即地址相同eg同一輛汽車(只有一輛))則返回true 

   return true;   

    }

           // 判斷當前的兩個字符串的內容是否一致

    if (anObject instanceof String) {
          String anotherString = (String)anObject;
          int n = count;
          if (n == anotherString.count) {
      char v1[] = value;
      char v2[] = anotherString.value;
       int i = offset;
       int j = anotherString.offset;
       while (n-- != 0) {
              if (v1[i++] != v2[j++])
              return false;
   }
return true;
    }
}
return false;

    }

測試代碼如下:

private static  void testEquals(){

int a = 5;
int b = 5;
System.out.println(a == b);

String aaString = new String("Hello");
String bbString = new String("Hello");

System.out.println(aaString == bbString);
System.out.println(aaString.equals(bbString));

System.out.println("------print the non string type -------");
Home homeA = new Home();
homeA.setDerection(1);
homeA.setPostion(1);

Home homeB = new Home();
homeB.setDerection(1);
homeB.setPostion(1);

System.out.println(homeA == homeB);
System.out.println(homeA.equals(homeB));
}

其中當前的Home類如下:

public class Home {

private int postion;
private int derection;
private volatile int hashCode;

public int getPostion() {
return postion;
}
public void setPostion(int postion) {
this.postion = postion;
}
public int getDerection() {
return derection;
}
public void setDerection(int derection) {
this.derection = derection;
}

}

打印結果如下:

true
false
true
------print the non string type -------
false

true

於是,得到如下結論:

1、對於基本數據類型,“==”比較的是兩者的值是否相等。
2、對於引用數據類型,(1)“==”比較的是引用的地址是否相同(即是否是同一輛汽車(注意,只有一輛汽車));
Object中的.equals()方法和"==’功能一樣
(2)但是String類中的.equals()方法重寫了,比較的是兩個引用對象的內容是否想同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章