7
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));
    }
}

当我执行它时显示“假”但对象在变量中包含相同的数据。为什么?解释。

4

9 回答 9

5

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

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

如果你想用equals()你的类中的方法检查相等性,你必须重写Object类的 equals() 方法。
how-to-override-equals-method-in-java,如下所示:

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

并且无论何时覆盖类的 equals方法,您都应该始终覆盖 hashCode()Object

#Effective Java,作者 Joshua Bloch

您必须在覆盖 equals() 的每个类中覆盖 hashCode()。不这样做将导致违反 Object.hashCode() 的一般约定,这将阻止您的类与所有基于哈希的集合(包括 HashMap、HashSet 和 Hashtable)一起正常运行。

于 2013-06-12T11:49:46.480 回答
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;
}

但为什么我必须 OVVERIDE EQUALS()

于 2013-06-12T11:49:12.250 回答
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;
}
于 2013-06-12T11:50:32.583 回答
1

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

覆盖equals以检查字段是否相等(并且hashCode,如果您正在使用它)。

于 2013-06-12T11:50:42.830 回答
1

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

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

于 2013-06-12T11:51:34.993 回答
0

因为你不覆盖.equals()(如果你这样做,你还必须覆盖.hashCode()),你使用Object'.equals()实现;当且仅当对象引用相等(即o1 == o2)时,此实现才返回 true。

于 2013-06-12T11:49:20.513 回答
0

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

于 2013-06-12T11:50:10.207 回答
0

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

有关更多信息,请参见此处使用 equals 方法比较两个对象,Java

于 2013-06-12T11:50:19.720 回答
0

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

于 2013-06-12T11:55:29.140 回答