assertEquals
equals
比較にメソッドを使用します。演算子assertSame
を使用する別のアサートがあり==
ます。
==
文字列で使用してはいけない理由を理解==
するには、何を行うかを理解する必要があります。これは、IDチェックを実行します。つまり、同じオブジェクトを参照しているa == b
かどうかを確認します。これは言語に組み込まれており、その動作は異なるクラスによって変更できません。この方法は、他の一方で、クラスによってオーバーライドすることができます。(クラス内の)デフォルトの動作は演算子を使用してIDチェックを実行することですが、などの多くのクラスはそれをオーバーライドして、代わりに「同等」チェックを実行します。の場合、同じオブジェクトをチェックして参照する代わりに、a
b
equals
Object
==
String
String
a
b
a.equals(b)
それらが参照するオブジェクトが両方ともまったく同じ文字を含む文字列であるかどうかを確認します。
類推時間:各String
オブジェクトが何かが書かれた一枚の紙であると想像してください。「Foo」と書かれた紙と「Bar」と書かれた紙があるとします。最初の2枚の紙を取り、==
それらを比較するために使用すると、false
本質的に「これらは同じ紙であるか?」と尋ねられるため、結果は戻ります。紙に書かれていることを見る必要さえありません。(同じものを2回ではなく)2枚の紙を渡すという事実は、それが戻ることを意味しますfalse
。equals
ただし、を使用すると、equals
メソッドは2枚の紙を読み取り、同じこと( "Foo")を言っていることがわかり、が返されtrue
ます。
文字列と混同されるビットは、Javaに文字列の「インターン」の概念があり、これがコード内の文字列リテラルに対して(効果的に)自動的に実行されることです。つまり、コードに2つの同等の文字列リテラルがある場合(それらが異なるクラスにある場合でも)、実際には両方とも同じString
オブジェクトを参照します。これにより、==
オペレーターtrue
は予想よりも頻繁に戻ります。