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

San*_*tha 5 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行它显示"false"但对象包含变量中的相同数据时.解释.

Sum*_*ngh 5

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

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 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 
}
Run Code Online (Sandbox Code Playgroud)

并且您应该始终覆盖 hashCode() 每当覆盖Object类的equals方法时。

#Effective Java,作者 Joshua Bloch

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


Sur*_*tta 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;
}
Run Code Online (Sandbox Code Playgroud)

但为什么我必须 OVVERIDE EQUALS()