159

Scalaの==との違いは何ですか? また、いつどちらを使用するのですか?.equals()

実装はJavaと同じですか?

編集:関連する質問は、の特定のケースについて話しAnyValます。より一般的なケースはAnyです。

4

5 に答える 5

213

通常は を使用し==、 にルーティングしますが、 s を適切equalsに処理します。null参照等価 (めったに使用されません) はeq.

于 2011-10-06T22:33:15.547 に答える
38

TL;DR

  • equals各インスタンスのコンテンツを比較するメソッドをオーバーライドします。これはequalsJava で使用されるメソッドと同じです。
  • 参照==を気にせずに演算子を使用して比較するnull
  • メソッドを使用eqして、両方の引数がまったく同じ参照であるかどうかを確認します。これがどのように機能するかを理解していない限り、使用しないことをお勧めします。多く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両方の引数が型である必要があるため、コンパイルされませんAnyRef
  • new ArrayList() equals new ArrayList()trueコンテンツをチェックするため、が返されます
  • new ArrayList() == new ArrayList()trueにリダイレクトされるため、が返されますequals(...)
  • new ArrayList() eq new ArrayList()false両方の引数が異なるインスタンスであるため、が返されます
  • foo equals fooが返されるtrue場合を除き、foonullスローされます。NullPointerException
  • foo == foo返品しますtrue、あってfoonull
  • foo eq footrue両方の引数が同じ参照にリンクしているため、が返されます。
于 2016-02-26T15:07:07.083 に答える
38

==は final メソッドであり、 final.equalsではない を呼び出します。

==これは、メソッドではなく演算子であり、オブジェクトの参照の等価性を厳密に比較するJava とは根本的に異なります。

于 2011-10-06T23:10:34.340 に答える
6

Scala ==では、最初にNull値をチェックしてから、最初のオブジェクトでequalsメソッドを呼び出します

于 2016-12-26T13:02:45.453 に答える