web-dev-qa-db-ja.com

Javaでequals()メソッドをオーバーライドする必要があるのはなぜですか?

_.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()メソッドをオーバーライドする必要がある理由がわかりません。

17
nakul

記事から JavaでequalsとhashCodeをオーバーライドする

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

Javaは、equalsとhashCodeメソッドをオーバーライドすることをお勧めします。平等が論理的な方法またはビジネスロジックを介して定義される場合:例:

Java標準ライブラリはそれをオーバーライドします。たとえば、Stringはequalsをオーバーライドします。equals()メソッドの実装は、2つのStringオブジェクトの内容がまったく同じ場合にtrueを返します。

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

43
Grijesh Chauhan

これで質問に答えるのに十分です: http://docs.Oracle.com/javase/tutorial/Java/IandI/objectclass.html

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

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

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

20
Byron

。equals()は、クラスがオーバーライドしない限り、ほとんどのクラスに対してインテリジェントな比較を実行しません。 (ユーザー)クラスに対して定義されていない場合、==と同じように動作します。

参照: http://www.leepoint.net/notes-Java/data/expressions/22compareobjects.html http://www.leepoint.net/data/expressions/22compareobjects.html

6
sabergeek

Java.lang.Objectのデフォルトの動作は参照を比較することですが、すべての種類のオブジェクトに適しているわけではありません。 Value Objects (BigDecimalやStringなど)と呼ばれるものがあります。同じ値を持つオブジェクトは互換性があると見なされるため、equalsのデフォルトの動作は望ましくありません。これらの種類のオブジェクトは、オブジェクトが使用する値に基づいて、等しいとハッシュコードを実装する必要があります。

3
Nathan Hughes

あなたの質問に答えるために、まず Documentation を見ることを強くお勧めします。

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

コードをクリーンに保つためにオーバーライドし、比較ステートメントをIfステートメントからオブジェクトに抽象化します。これは優れたプラクティスと見なされ、Javaのオブジェクト指向アプローチを活用しています。

2
christopher

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

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

BookPage a = getSecondPage();

BookPage b = getThirdPage();

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

しかし、コンテンツを比較したい場合はどうしますか?

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

2
user1559897

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

2
Basanta

Object.equals()メソッドは、プリミティブデータ型またはオブジェクト値(プリミティブデータのラッパークラスオブジェクト、単純なプリミティブデータ型(byte、short、int、longなど))ではなく、オブジェクトの参照のみをチェックします。そのため、プリミティブデータ型に基づいてオブジェクトを比較するときにequals()メソッドをオーバーライドする必要があります。

1
App Kart