、==
はtrue
を返しますが、equals
はfalse
を返します。いずれかのシナリオがあります。
私は、これはあなたが考えている正確に何であるかどうかわからないんだけど、equals
の実装はスレッドセーフである必要はなく、引数がthis
と同じインスタンスである場合には明示的にチェックする必要はありません。つまり、foo.equals(foo)
がfoo
が別のスレッドで同時に変更されている場合は、false
を返すことが原則として可能です。
このチェックを含むではないと明示的に文書化されているのではないかと疑います。むしろ、これは唯一のチェックであるクラスを除いて実装の詳細とみなされます。しかし、私はsb.equals(sb)
を少なくともArrayIndexOutOfBoundsException
になるように管理しました。sb
がStringBuilder
の場合、別のスレッドが忙しく要素を追加しています。あなたのタイミングで特に不運な場合は、false
も返すことができます。
また、このような動作を行う可能性はありますか?
私は本当にそうは思わない。 equals
の全目的はSet
とMap
とAssert.assertEquals
のようなものをサポートすることです。 equals
を一切使用しないユースケースがたくさんありますが、はを使用します。ではなくは、満足している平等の形式を表しています。身元。
しかし、ひどく重大でないコードでも、誤ってこれを引き起こすバグがある可能性は確かです。たとえば、上記のコメントで、java.util.Date
とjava.sql.Timestamp
にはデザインミスがありました(現在正式に成文化されています)。date.equals(ts)
はtrue
ですが、ts.equals(date)
はfalse
です。この種の問題に対処しようとする人はjava.util.Date
に、if (that.getClass() == Date.class)
のチェックを含むように修正するかもしれません。この場合、親実装を明示的にオーバーライドしていないサブクラスでは、非リフレクティブequals
の実装が行われます。 (もちろん、私はJDKにこのような間違いがあるとは思わないでしょう)
実際には継承の面でequals
を書くのはやや難しいですが、幸いにもすべての複雑さを簡単な方法で解決する既知の解決法があります。 http://www.artima.com/lejava/articles/equality.html。
はい、ほとんどです。 '=='と 'equals()'は全く違った働きをします。通常は 'equals()'が必要です。 – markspace
@markspaceここで、 '=='はfalseですが、 'equals'は' true'です。 –
@markspace私は彼らの仕事が異なっていることは分かっています。 '=='は参照チェックで、 'equals'はクラスメソッドです。 –