2015-07-13 67 views
0
class Emp { 
    public Emp(String s) { 

    } 
} 

public class Testing { 
    public static void main(String[] args) { 
     Emp e1 = new Emp("hello"); 
     Emp e2 = new Emp("hello"); 
     System.out.println(e1 == e2); 
     System.out.println(e1.equals(e2)); 

     String s1 = new String("hello"); 
     String s2 = new String("hello"); 
     System.out.println(s1 == s2); 
     System.out.println(s1.equals(s2)); 
    } 

} 

輸出爲:false false false true如何等於比較兩個對象時,方法返回false:e1.equals(E2)

+0

@vrs,什麼是可比的接口與equals方法在此quesiton的關係? –

+3

可能的重複[爲什麼我們必須重寫java中的equals()方法](http://stackoverflow.com/questions/15175109/why-do-we-have-to-override-equals-method-in-java ) –

+0

查看下面的答案。 –

回答

1

爲了e1.equals(e2)返回true,無論是默認的實現Objectequals的應返回true (要求e1==e2),或者您應該在Emp類中重寫equals,以便在應用於e1e2實例時返回true。

+0

非常謝謝葉蘭,但我想知道什麼是e1.equals(E2)的原因返回false和 – chinnaraj

+1

@chinnaraj String類覆蓋了equals方法s1.equals(S2)返回true,所以即使'S1 = = s2'爲假,如果兩個字符串按照相同的順序具有完全相同的字符,則s1.equals(s2)可以爲真。 – Eran

+0

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals%28java.lang.Object%29 –

3

如果您不覆蓋方法hashcodeequals,則默認的equals方法將返回true,如果它們位於相同的內存位置。由於e1e2是獨立的對象,它們位於單獨的存儲位置,因此沒有覆蓋equalse1.equals(e2)將是錯誤的。

0

「Emp」類繼承根「OBJECT」類的equals()方法。

下面是equals()方法存在於對象類方法的代碼:

public boolean equals(Object obj) 
{ 
    return (this == obj); 
} 

正如你可以看到,高於該檢查存儲器位置的地址是否相等。

第一種情況:

Emp e1 = new Emp("hello"); 
Emp e2 = new Emp("hello"); 
System.out.println(e1 == e2); 

這裏你比較基準(內存位置),因爲你已經創建了堆了兩個新的對象,有memroy位置是不同的,因此,它重新調整「假」

第二種情況:

Emp e1 = new Emp("hello"); 
Emp e2 = new Emp("hello"); 
System.out.println(e1.equals(e2)); 

在這裏,您是從「對象」類inturn檢查引用involing繼承的equals()方法(內存locati )這兩個對象,因此重新回到錯誤。

第三種情況:

String s1 = new String("hello"); 
    String s2 = new String("hello"); 
    System.out.println(s1 == s2); 

在這種情況下String類具有equals()方法重寫實際上檢查用於比較的對象字段,下面是用於equals()方法在字符串類的源代碼的方法:

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     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; 
} 

這類似於第一種情況,在這裏你比較兩個字符串對象的引用(內存位置),因爲你已經在堆上創建兩個新的對象,有memroy位置是不同的,因此,它重新調整「假「

第四種情況:

String s1 = new String("hello"); 
    String s2 = new String("hello"); 
    System.out.println(s1.equals(s2)); 

這裏要調用的重載equals()方法從字符串類方法(上面的代碼粘貼)。如果你看到第一個邏輯實際上檢查兩個refrences是否指向相同的內存位置(如果相同),則返回true,否則它將實際檢查由charcter數組支持的兩個字符串對象的內容,它會比較每一個字符與這些拖曳字符串對象的核心應答,因爲兩個對象具有相同的內容「你好」,它返回true。

肯上述請到通過的equals()和hashCode()的合同。

0
 System.out.println(e1 == e2); <-- A 
     System.out.println(e1.equals(e2)); <-- B 
     System.out.println(s1 == s2); <-- C 
     System.out.println(s1.equals(s2)); <-- D 
  1. 表達A =>返回false。這是非常明顯的,因爲這個表達式比較兩個不同的對象
  2. 表達式B =>返回false。每班都含蓄地延伸Object班。因此,equals方法的實現方案是採用在Object類中定義的一個,其與表達的相同甲
  3. 表達式c =>返回false。原因與表達式A相同,比較兩個不同的對象
  4. 表達式D =>返回true。因爲String類有它自己的實現equals函數,它檢查字符串的值。