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

実行すると「false」と表示されますが、オブジェクトには変数に同じデータが含まれています.why?explain.

4

9 に答える 9

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

Object.equals() メソッドは、比較される 2 つのものが文字通り同じオブジェクトであるかどうかをテストしています。a1 と a2 には同じ情報が含まれていますが、メモリ内の異なるオブジェクトです。

オブジェクト内の情報の等価性をテストしたい場合は、クラスにComparableインターフェースを実装させ、メソッドをオーバーライドすることができますcompareTo

于 2013-06-12T11:51:34.993 に答える
1

オーバーライドしませんでしたequalsequalsから継承されたデフォルトの実装は、2 つの変数が同じオブジェクトを指している場合にのみObject戻ります。true

equalsフィールドが等しいかどうかを確認するためにオーバーライドします(そしてhashCode、もしそうなら)。

于 2013-06-12T11:50:42.830 に答える
0

Object クラスの実装、つまりデフォルトの実装は参照をチェックします。したがって、参照が同じ場合は true を返し、それ以外の場合は false を返します。

于 2013-06-12T11:55:29.140 に答える