2013-03-21 17 views
5

equals方法比較兩個對象的值是否相等或不equals()方法的工作。我的問題是如何比較這兩個對象?它怎麼能說這兩個物體是平等的?我想知道什麼它比較兩個對象。我不包括hashCode方法。如何在Java中

+0

如果你需要比較對象,我建議你看一下番石榴庫對象助手:https://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained – evgenyl 2013-03-21 08:39:26

回答

6

默認實現,類java.lang.Object的一個,只需測試參考是相同的對象:

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

基準相等運算符在Java Specification這樣描述:

在運行時,如果操作數的值都爲空 或兩者指代相同的對象或數組==的結果爲真實的;否則,結果 是錯誤的。

這種默認行爲通常不是語義上的滿足。例如使用==無法測試大整數情況下的平等:

Integer a = new Integer(1000); 
Integer b = new Integer(1000); 
System.out.println(a==b); // prints false 

這就是爲什麼該方法被重寫:

722  public boolean equals(Object obj) { 
723   if (obj instanceof Integer) { 
724    return value == ((Integer)obj).intValue(); 
725   } 
726   return false; 
727  } 

這使得這樣的:

System.out.println(a.equals(b)); // prints true 

類重寫默認行爲應該基於識別字段(通常是所有字段)的等同性來測試語義平等。

你似乎知道,你應該相應地覆蓋hashCode方法。

0

邏輯,等於不比較對象(但你可以用它做任何事情),它比較值。爲對象比較有「==」運算

+1

我不同意。 Equals將對象與創建方式進行比較。正如破譯所解釋的那樣 - 通常它會比較價值,但不總是,而且並不總是全部。例如。對於實體等於方法通常只比較id字段。 – robson 2013-03-21 08:44:37

+0

我提到'邏輯'和'你可以做任何事情'。 'equals'假設比較對象'有意義',否則你可能沒有'=='對象。 – Ankit 2013-03-21 08:52:55

4

考慮下面的例子,

public class Employee { 
    String name; 
    String passportNumber; 
    String socialSecurityNumber; 
    public static void main(String[] args) { 
     Employee e1 = new Employee(); 
     Employee e2 = new Employee(); 
     boolean isEqual = e1.equals(e2); // 1 
     System.out.println(isEqual); 
    } 
} 

在在註釋// 1中的代碼,它調用繼承其簡單地比較的e1e2引用對象類equals方法。因此,對於使用new關鍵字創建的每個對象,它始終會給出false

以下是從對象

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

爲了比較平等檢查JLS給equals方法在我們的類要覆蓋的方法摘錄。這不是最終的方法。 JLS不知道程序設計師希望兩個對象相等的原因。所以他們給了非最終的方法來覆蓋。
hashcode不起作用檢查對象的平等。 hashcode檢查/找到Bucket的哪個對象可用。我們使用hashcode在哈希技術,它被某些類,如HashMap中..

如果兩個對象的hashCode是平等的,做不意味着兩個對象是相等的。
對於兩個對象,如果equals方法返回true,則hashcode必須相同。

你將不得不重寫equals方法來決定你想要對象上面的代碼e1e2等於其基礎。它是基於passportNumber還是socialSecurityNumber或者passportNumber+socialSecurityNumber的組合?

I want to know based on what it compares the two objects. 

的回答是,在默認情況下繼承Object類的equals方法的幫助下它使用==符號比較兩個對象的引用相等。代碼在上面給出。