0

この質問は 2 つに分けるべきかもしれませんが、最初の質問は非常に単純.equals()です。ここで説明されているように、 == は2つの参照が同じオブジェクトを指している.equals()かどうかをチェックし、パラメーターの値が同じかどうかをチェックすると思いました: http://www.coderanch.com/t/409507/java/java/Difference-等しい

しかし、私はこれを実行しようとしました:

public class EqualsTest {

    public static void main(String[] args) {
        Integer i1 = new Integer(1);
        Integer i2 = new Integer(1);
        System.out.println(i1.equals(i2));

        Nested n1 = new Nested();
        Nested n2 = new Nested();
        n1.i = i1;
        n2.i = i2;
        System.out.println(n1.equals(n2));
    }
}

class Nested {
    Integer i;
}

そして、私は出力として得ます:

true
false

Javadoc http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals(java.lang.Object)を読むと予想どおり

したがって、私の理解では、.equals()== と異なるようにするには、オーバーライドする必要があります。右?

私の 2 番目の質問は、メソッド .equals() をオーバーライドせずに、クラスのオブジェクトを<A>一意にする ( を呼び出すときに自動的にオーバーライドされるadd())方法はありますか?Set<A><A>

4

3 に答える 3

3

.equals() を == とは異なるものにするには、オーバーライドする必要があります。右?

はい、そうです。

メソッド .equals() をオーバーライドせずに、セットでクラスのオブジェクトを一意にする (add() を呼び出すときに自動的にオーバーライドされる) 方法はありますか?

equals をオーバーライドしない場合、新しいインスタンスはそれぞれ、セットの観点から一意に見えます。

于 2013-05-16T14:52:38.013 に答える
1

.equals() のオーバーライドはプロセスの一部ですが、hashCode()もオーバーライドする必要があります。

セットでは、特にHashSet.hashCode() メソッドが呼び出されてハッシュコードが取得され、2 つのオブジェクトが同じ hashCode を持つ場合にのみ、.equals() がチェックされます。

equals/hashcodeここで契約に関するドキュメントを読む必要があります。

于 2013-05-16T15:22:52.727 に答える