2013-06-12 52 views
6
public class Account { 

    String account; 
    double balance; 

    Account(String account, double balance) { 
     this.account = account; 
     this.balance = balance; 
    } 
} 

public class AccountTest { 

    public static void main(String[] args) { 
     Account a1 = new Account("Sandy", 1000); 
     Account a2 = new Account("Sandy", 1000); 
     System.out.println(a1.equals(a2)); 
    } 
} 

當我執行它顯示「false」但對象包含變量中的相同數據時。爲什麼解釋。爲什麼使用equals()方法時兩個具有相同數據的對象不相等

+0

但爲什麼是負面投票? – vineet

回答

2

您需要重寫equals()方法,並在需要比較其值時使用它。

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final Account other = (Account) obj; 
    if ((this.account== null) ? (other.account!= null) : !this.account.equals(other.account)) { 
     return false; 
    } 
    if (this.balance!= other.balance) { 
     return false; 
    } 
    return true; 
} 

BUT WHY I HAVE TO OVVERIDE EQUALS()

0

既然你不重寫.equals()(如果你這樣做,你必須覆蓋.hashCode()),您使用Object.equals()執行;當且僅當對象引用是相等的(即,o1 == o2),此實現返回true。

4

因爲默認情況下對象基於equals(Object obj)檢查相等性。

的等於Object類方法實現對象上差別可能性最大的等價關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

如果你想在你的類equals()方法來檢查平等等於你必須重載equals()Object類的方法。
how-to-override-equals-method-in-java,像以下:

@Override 
public boolean equals(Object obj) { 
    // your implementation 
} 

,你應該Objectalways override hashCode() whenever overriding equals方法。

#Effective Java中,由Joshua布洛赫

你必須在每一個重寫的equals類重載hashCode()()。如果不這樣做將違反Object.hashCode()的一般合約,這會阻止您的類與所有基於散列的集合(包括HashMap,HashSet和Hashtable)一起正常運行。

+0

有效的Java引理8,正如我記得的。 – johnchen902

+0

我不*喬舒亞布洛赫!如果我說錯了什麼,我很抱歉我的英文不好。 – johnchen902

+0

對不起@ johnchen902我誤解了:) –

0

您需要重寫Object.equals()方法。

+0

默認情況下,它檢查'this == obj'。 – johnchen902

+0

是的,你是對的.. – vineet

2

你需要重寫equals

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof Account)) 
     return false; 
    Account that = (Account) obj; 
    return (account == null ? that.account == null : account 
      .equals(that.account)) && balance == that.balance; 
} 

我差點忘了覆蓋hashCode覆蓋equals

@Override 
public int hashCode() { 
    int hash = 17; 
    hash = 37 * hash + (account == null ? 0 : account.hashCode()); 
    long l = Double.doubleToLongBits(balance); 
    hash = 37 * hash + (int) (l^(l >>> 32)); 
    return hash; 
} 
1

時未覆蓋equals。當且僅當兩個變量指向同一個對象時,從Object繼承的默認equals實現返回true

重寫equals檢查字段是否相等(如果您在此處,則爲hashCode)。

1

Object.equals()方法正在測試以查看被比較的兩個東西是否完全相同。雖然a1和a2包含相同的信息,但它們是內存中的不同對象。

如果要測試對象內信息的相等性,可以讓該類實現Comparable接口並覆蓋compareTo方法。

0

Object類中的實現,即默認實現檢查引用。 因此,如果引用相同,則返回true否則返回false。

相關問題