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