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