1

私はいくつかのコードを作成していて、オブジェクトが eno equals であることがわかりました。これは些細な質問ですが、デフォルトの equals がどのように機能するかを理解していません。

class A {
    String id;
    public A(String id) {
        this.id = id;
    }

    public static void main(String args[])
    {
        A a = new A("1");
        A b = new A("1");
        System.out.println(a.id);
        System.out.println(b.id);
        System.out.println(a.equals(b));
    }
}

結果は次のとおりです。

1
1
false

a.equals(b) == trueしかし、私はそれがなぜなのか知りたいfalseですか?

4

4 に答える 4

4

オブジェクトでequals()をオーバーライドしない場合は、2つの異なるメモリ参照を比較しています。したがって、equals()をオーバーライドして、idフィールドを比較します。

于 2013-02-12T01:50:09.147 に答える
4

あなたのクラスは現在クラスのみを拡張してObjectおり、オブジェクトクラスのequalsメソッドは次のようになります

public boolean equals(Object obj) {
    return (this == obj);
}

必要なのは、このメソッドをオーバーライドすることです。たとえば、このように

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    A other = (A) obj;
    if (id == other.id)
        return true;
    if (id == null)
        return false;
    if (other.id == null)
        return false;
    if (!this.id.equals(other.id))
        return false;
    return true;
}

また、オーバーライドequalsする場合は、おそらくhashCodeメソッドをオーバーライドする必要がありますが、これは質問の対象ではありません。詳細については、こちらをご覧ください。

于 2013-02-12T01:46:34.407 に答える
1

Objectデフォルトではのメソッドをオーバーライドequalsし、「同じコンテンツ」ではなく「同じオブジェクト」をチェックします。が必要な場合はa.equals(b) == true、オーバーライドする必要があります。

@Override
public boolean equals (Object obj) {
    if (obj instanceof A) {
        A a = (A) obj;
        if (id == null) {
            return a.id == null;
        } else {
            return id.equals(a.id);
        }
    }
    return false;
}

----- 編集済み -----

于 2013-02-12T01:46:31.300 に答える
0

toString() メソッドと同じように、コードの equals() メソッドを書き直す必要があります。

于 2013-12-22T22:03:54.043 に答える