使用equals()方法时,为什么具有相同数据的两个对象不相等

时间:2013-06-12 11:46:10

标签: java string equals

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”但对象在变量中包含相同的数据。为什么?解释。

9 个答案:

答案 0 :(得分:4)

因为默认情况下对象会根据equals(Object obj)检查相等性。

  
    

类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

  

如果要在类中使用equals()方法检查相等,则必须覆盖Object类的equals()方法。
how-to-override-equals-method-in-java,如下:

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

你应该Object类的always override hashCode() whenever overriding equals方法。

#Effective Java,Joshua Bloch

  
    

您必须覆盖覆盖equals()的每个类中的hashCode()。如果不这样做,将导致违反Object.hashCode()的常规合同,这将阻止您的类与所有基于散列的集合(包括HashMap,HashSet和Hashtable)一起正常运行。

  

答案 1 :(得分: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()

答案 2 :(得分: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;
}

答案 3 :(得分:1)

您没有覆盖equals。当且仅当两个变量指向同一对象时,从equals继承的默认Object实现才会返回true

覆盖equals以检查字段相等性(如果您在,则hashCode)。

答案 4 :(得分:1)

Object.equals()方法正在测试以查看被比较的两件事情是否是同一个对象。虽然a1和a2包含相同的信息,但它们是内存中的不同对象。

如果要测试对象内部信息的相等性,可以让类实现Comparable接口并覆盖compareTo方法。

答案 5 :(得分:0)

由于你没有覆盖.equals()(如果你这样做,必须也覆盖.hashCode()),你使用Object的{​​{1}实施;当且仅当对象引用相等时(即.equals())。

,此实现返回true

答案 6 :(得分:0)

您需要覆盖Object.equals()方法。

答案 7 :(得分:0)

如果true,它会显示a1.balance==a2.balance。请注意,equals()比较对象而不是实际值。为了能够比较对象,您必须覆盖equals()方法。

有关详细信息,请参阅此处Comparing two objects using an equals method, Java

答案 8 :(得分:0)

Object类中的实现,即默认实现检查引用。 因此,如果引用相同则返回true,否则返回false。