1

私はそのようなテストクラスを持っています:

public class CompareObjects {

public static class Obj {
    public int i;

    public Obj(int i) {
        this.i = i;
    }
}

public static void main(String[] args) {
    Obj o1 = new Obj(0);
    Obj o2 = new Obj(0);

    if(o1 == o2) {
        System.out.println("Equal");
    }else{
        System.out.println("Not equal");
    }
}

}

テストでは「等しい」が返されますが、返されませんでした。なぜJavaは、同じコンポーネントを持つ2つのオブジェクトを同じではないと見なさないのですか?私はここで何か間違ったことをしていますか?Javaを学び始めたとき、何かを完全に見落としていたような気がします。

また、equals()メソッドを使用して2つを相互にテストしたところ、同じ結果が得られました。この質問の理由は、contains()メソッドを使用してArrayListをテストし、あるオブジェクトが別のオブジェクトと同じコンポーネントを持ち、したがって等しいかどうかを確認できるようにするためです。何か案は?

4

4 に答える 4

4

==オブジェクトへの参照を比較します。例えば:

Obj a = new Obj(0);
Obj b = a;
//a == b

実装してみてくださいequals()

public static class Obj {
    public int i;

    public Obj(int i) {
        this.i = i;
    }

    @Override
    public boolean equals(Object other) {
        if (other == this) return true;
        if (!(other instanceof Obj) || other == null) return false;
        return i == ((Obj)other).i;
    }

    @Override
    public int hashCode() {
        return i;
    }
}

次に、を使用できますif(o1.equals(o2)) {。ただし、これは実際には良い例ではありません。詳細については、こちら(リンク)をお読みください。

于 2013-01-01T20:51:02.807 に答える
2

==同じオブジェクト[つまり、同じメモリ位置]を比較している場合にのみtrueを返します。

オブジェクトをフィールドごとに比較する場合は、オブジェクトの同値関係equals()を誘導するために、メソッドをオーバーロードする必要があります。

public boolean equals(Object other){

    return this.i == other.i;

}

equals()メソッドが再帰性、対称性、推移性を尊重していることを確認してください。

于 2013-01-01T20:50:47.407 に答える
1

==参照の等式を比較します。つまり、メモリ内の同じオブジェクトを参照している場合です。

メソッドをオーバーライドequals()し、それらの値を比較するときはいつでもそれを使用する必要があります。hashCode()また、たとえばHashMapで使用されるオーバーライド。

于 2013-01-01T20:50:54.847 に答える
0

オペレーターは、==クラスデータが等しいかどうかをチェックしません。むしろ、それらがメモリ内の同じ場所にあるかどうかを確認します。o2 = o1それらを同じ方法で初期化する代わりに行った場合、それらはメモリ内の同じ場所になるため、o2==o1を返しtrueます。ただし、個別に初期化されているため、falseを返します。代わりに、equalsメソッドを定義して実装する必要があります。

于 2013-01-01T20:51:11.040 に答える