19

.equalsメソッドをオーバーライドする理由について、いくつかの混乱があります。

例えば:

Test test1 = new Test(3);
Test test2 = new Test(3);

//The if comparison does the same thing that the overridden `.equals()` method does.
if(test1.equals(test2)){
    System.out.println("test1 and test2 are true in .equals()");
}

// Override .equals method.
public boolean equals(Object object) {
    if(object instanceof Test && ((Test)object).getValue() == this.t) {
        return true;
    } else {
        return false;
    }
}

.equals()メソッドをオーバーライドする必要がある理由がわかりません。

4

8 に答える 8

45

記事Override equals and hashCode in Javaから:

java.lang.Object によって提供される equals() クラスのデフォルトの実装は、メモリ位置を比較し、2 つの参照変数が同じメモリ位置を指している場合、つまり本質的に同じオブジェクトである場合にのみ true を返します。

等価性が論理的な方法または何らかのビジネス ロジックによって定義される場合、 Javaは equalsおよび hashCode メソッドをオーバーライドすることを推奨します。例:

Java 標準ライブラリの多くのクラスはそれをオーバーライドします。

整数ラッパー クラスは equals をオーバーライドして、数値比較などを実行します。

于 2013-03-02T13:53:25.337 に答える
20

これはあなたの質問に答えるのに十分なはずです: http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

このequals()メソッドは、2 つのオブジェクトが等しいかどうかを比較trueし、等しい場合は戻ります。クラスで提供されるequals()メソッドObjectは、恒等演算子 ( ==) を使用して、2 つのオブジェクトが等しいかどうかを判断します。プリミティブ データ型の場合、これにより正しい結果が得られます。ただし、オブジェクトの場合はそうではありません。equals()によって提供されるメソッドは、オブジェクト参照が等しいかどうか、つまり、比較されるオブジェクトがまったく同じObjectかどうかをテストします。

2 つのオブジェクトが等価性(同じ情報を含む) という意味で等しいかどうかをテストするには、メソッドをオーバーライドする必要がありますequals()

(部分引用 - クリックして例を読んでください。)

于 2013-03-02T13:49:52.577 に答える
3

java.lang.Object のデフォルトの動作は参照を比較することですが、これはすべての種類のオブジェクトに適しているわけではありません。値オブジェクト(BigDecimal や String など)と呼ばれるものがあり、同じ値を持つオブジェクトは交換可能と見なされるため、equals の既定の動作は望ましくありません。これらの種類のオブジェクトは、オブジェクトが取る値に基づいて equals と hashcode を実装する必要があります。

于 2013-03-02T15:07:04.087 に答える
2

あなたの質問に答えるには、まずドキュメントを見ることを強くお勧めします。

equals() メソッドをオーバーライドしないと、「==」のように動作します。オブジェクトで「==」演算子を使用すると、それらのポインターが同じオブジェクトを参照しているかどうかが単純にチェックされます。メンバーに同じ値が含まれている場合はそうではありません。

コードをクリーンに保つためにオーバーライドし、比較ロジックを If ステートメントからオブジェクトに抽象化します。これは良い方法と考えられており、Java の高度なオブジェクト指向アプローチを利用しています。

于 2013-03-02T13:53:11.750 に答える
2

私が非常に役立つと思う例を挙げましょう。

参照は、本のページ番号と考えることができます。以下のように a と b の 2 つのページがあるとします。

BookPage a = getSecondPage();

BookPage b = getThirdPage();

この場合、 a == b は false になります。しかし、なぜ?その理由は、== が行っていることは、ページ番号を比較するようなものだからです。したがって、これら 2 つのページの内容がまったく同じであっても、false になります。

しかし、コンテンツを比較したい場合はどうすればよいでしょうか?

答えは、独自の equals メソッドを作成し、実際に比較したいものを指定することです。

于 2014-06-02T20:56:11.207 に答える
2

デフォルトでは、 . equals() は == ID 関数を使用して比較しますが、これはインスタンス test1 と test2 が同じではないため、明らかに機能しません。== は、int や string などのプリミティブ データ型でのみ機能します。したがって、 Test クラスのすべてのメンバー変数を比較して、それを機能させるためにオーバーライドする必要があります

于 2014-07-24T01:43:30.367 に答える