Scalaの==との違いは何ですか? また、いつどちらを使用するのですか?.equals()
実装はJavaと同じですか?
編集:関連する質問は、の特定のケースについて話しAnyValます。より一般的なケースはAnyです。
Scalaの==との違いは何ですか? また、いつどちらを使用するのですか?.equals()
実装はJavaと同じですか?
編集:関連する質問は、の特定のケースについて話しAnyValます。より一般的なケースはAnyです。
通常は を使用し==、 にルーティングしますが、 s を適切equalsに処理します。null参照等価 (めったに使用されません) はeq.
equals各インスタンスのコンテンツを比較するメソッドをオーバーライドします。これはequalsJava で使用されるメソッドと同じです。==を気にせずに演算子を使用して比較するnulleqして、両方の引数がまったく同じ参照であるかどうかを確認します。これがどのように機能するかを理解していない限り、使用しないことをお勧めします。多くequalsの場合、代わりに必要なものが機能します。そして、これはAnyRef引数だけでなく、引数でのみ使用するようにしてくださいAny注: の場合equals、Java の場合と同様に、引数を切り替えると同じ結果が返されない場合があり1.equals(BigInt(1))ます。これは、各実装が特定の型のみをチェックするためです。プリミティブ数は、2 番目の引数が no 型であるかどうかをチェックせず、他のプリミティブ型のみをチェックしますfalsetrueNumberBigInt
AnyRef.equals(Any)メソッドは、サブクラスによってオーバーライドされたものです。Scala にも導入された Java 仕様のメソッド。ボックス化されていないインスタンスで使用すると、これを呼び出すためにボックス化されます (Scala では隠されていますが、Java ではint->を使用するとより明白になりますInteger)。デフォルトの実装は参照を比較するだけです (Java のように)。
このAny.==(Any)メソッドは 2 つのオブジェクトを比較し、いずれかの引数を null にすることができます (2 つのインスタンスで静的メソッドを呼び出しているかのように)。両方が であるかどうかを比較し、ボックス化されたインスタンスnullでメソッドを呼び出します。equals(Any)
このAnyRef.eq(AnyRef)メソッドは、参照のみを比較します。参照は、インスタンスがメモリ内に配置されている場所です。このメソッドには暗黙的なボクシングはありません。
1 equals 2falseにリダイレクトされるため、が返されますInteger.equals(...)1 == 2falseにリダイレクトされるため、が返されますInteger.equals(...)1 eq 2両方の引数が型である必要があるため、コンパイルされませんAnyRefnew ArrayList() equals new ArrayList()trueコンテンツをチェックするため、が返されますnew ArrayList() == new ArrayList()trueにリダイレクトされるため、が返されますequals(...)new ArrayList() eq new ArrayList()false両方の引数が異なるインスタンスであるため、が返されますfoo equals fooが返されるtrue場合を除き、fooがnullスローされます。NullPointerExceptionfoo == foo返品しますtrue、あってfooもnullfoo eq footrue両方の引数が同じ参照にリンクしているため、が返されます。==は final メソッドであり、 final.equalsではない を呼び出します。
==これは、メソッドではなく演算子であり、オブジェクトの参照の等価性を厳密に比較するJava とは根本的に異なります。
Scala ==では、最初にNull値をチェックしてから、最初のオブジェクトでequalsメソッドを呼び出します