0

オブジェクトを TreeSet に追加しています。そして、ハッシュベースのコレクションでは決して使用しません。TreeSet は、compareTo メソッドのオーバーライドが必要であり、メソッドのオーバーライドは必要ないと思います。equals メソッドをオーバーライドしないことをお勧めしますか? いいえの場合、ハッシュベースのコレクションでは使用しないため、equals メソッドのオーバーライドが必要なのはなぜですか?

更新: javadoc によると、

(x.compareTo(y)==0) == (x.equals(y)) にすることを強くお勧めしますが、厳密には必須ではありません。一般的に言えば、 Comparable インターフェースを実装し、この条件に違反するクラスは、この事実を明確に示す必要があります。推奨される言語は、「注: このクラスには、equals と矛盾する自然な順序付けがあります。」

正直なところ、equals の実装を強く推奨する理由がわかりませんでした。

4

4 に答える 4

4

常に維持hashCode()してequals()調整することをお勧めします。

来週、HashMap でそれを使用する可能性があることをあなたは知りません。あなたのクラスを使用している他の誰かも、それが行われたと想定するでしょう。

于 2013-08-26T16:17:25.073 に答える
2

ハッシュベースのコレクションでは使用しないため、equals メソッドのオーバーライドが必要なのはなぜですか?

このequalsメソッドは、驚きを避けるために必要です。ハッシュベースのコレクションでは使用しないと言います。しかし、他の誰かがそうするかもしれません。等号を追加する必要があることを忘れずに、あなた自身が からTreeSetに変更する可能性があるとさえ言えます。HashSet

これは 1 つの理由にすぎませequalscompareTo。他にも考えられますが、基本的にはすべて一貫性を示していx.compareTo(y) == 0ますx.equals(y)

于 2013-08-26T16:27:34.390 に答える
0

オーバーライドequals()は、ハッシュ コンテナーとは関係ありません。クラスの平等のカスタム概念が必要かどうかに関係しています。をオーバーライドする場合compareTo()はそうするので、単純に正確さを期すために、 をオーバーライドする必要がありますequals()

オーバーライドhashCode()は、ハッシュ コンテナーともほとんど関係ありません。たまたま使用されているだけですが、他のものもハッシュコードを使用できます。hashCode()と常に同期しておく必要がありequals()ます。それをしない言い訳はありません。

驚きを最小限に抑えるために、強力な推奨事項があります。が 0 を返す場合compareTo()、2 つのオブジェクトが等しいと予想します。一致しないと非常に混乱equals()します。

于 2013-08-26T16:17:53.740 に答える
-1

equals代わりに==演算子を使用してJavaオブジェクトを比較することは常に良いことであり、むしろ必要です。equals 実装では、オブジェクトをその属性値と比較できるためです。== を使用すると、2 つの参照が同じメモリ オブジェクトを指しているかどうかのみを確認できます。

ハッシュされたコレクションの場合、オブジェクトの取得が複雑になるため、より重要になります。

于 2013-08-26T16:25:30.693 に答える