質問

== には2つの Strings を比較するときに問題が発生することがわかっています。 String.equals()がより良いアプローチのようです。まあ、私はJUnitテストを行っており、私の傾向は assertEquals(str1、str2)を使用することです。これは、2つの文字列に同じコンテンツが含まれていると断言する信頼できる方法ですか? assertTrue(str1.equals(str2))を使用しますが、失敗時の期待値と実際の値を確認するメリットが得られません。

関連するメモで、 str1 == str2 の問題をわかりやすく説明するページまたはスレッドへのリンクはありますか?

役に立ちましたか?

解決

Javaで Strings を比較するときは、 .equals()常に使用する必要があります。

JUnitは .equals()メソッドを呼び出して、メソッド assertEquals(Object o1、Object o2)の等価性を判断します。

したがって、 assertEquals(string1、string2)を使用すると間違いなく安全です。 ( String sは Object sであるため)

Stackoverflowのすばらしい質問へのリンク == .equals()のいくつかの違いについて。

他のヒント

assertEquals は、比較のために equals メソッドを使用します。 == 演算子を使用する別のアサート assertSame があります。

== を文字列で使用しない理由を理解するには、 == の機能を理解する必要があります。IDチェックを行います。つまり、 a == b は、 a b 同じオブジェクトを参照しているかどうかを確認します。これは言語に組み込まれており、その動作は異なるクラスによって変更することはできません。一方、 equals メソッドはクラスでオーバーライドできます。 ( Object クラスでの)デフォルトの動作は == 演算子を使用してIDチェックを行うことですが、 String を含む多くのクラスはオーバーライドします代わりに「同等」を実行します。チェック。 String の場合、 a b が同じオブジェクトを参照しているかどうかを確認する代わりに、 a.equals(b)は、参照するオブジェクトが両方ともまったく同じ文字を含む文字列であるかどうかを確認します。

分析の時間:各 String オブジェクトは、何かが書かれた紙であると想像してください。 「Foo」が付いた2枚の紙があるとします。それらに書かれたものと、「バー」が付いた別のそれに書かれた。最初の2枚の紙を取り、それらを比較するために == を使用すると、「これらは同じ紙ですか?」と本質的に尋ねているため、 false が返されます。 。紙に書かれていることを見る必要さえありません。 (同じものを2回ではなく)2枚の紙に渡すということは、 false を返すことを意味します。ただし、 equals を使用すると、 equals メソッドは2枚の紙を読み、同じことを言っていることを確認します(" Foo")ので、 llは true を返します。

文字列と混同されるのは、Javaに「インターン」という概念があるということです。文字列。これは、コード内の文字列リテラルに対して(効果的に)自動的に実行されます。つまり、コードに2つの同等の文字列リテラルがある場合(異なるクラスにある場合でも)、実際には両方が同じ String オブジェクトを参照します。これにより、 == 演算子は、予想よりも頻繁に true を返します。

簡単に言えば、同じ文字を含むが異なるオブジェクトである2つのStringオブジェクトを(異なるメモリの場所に)持つことができます。 ==演算子は2つの参照が同じオブジェクト(メモリの場所)を指していることを確認しますが、equals()メソッドは文字が同じかどうかを確認します。

通常、2つの文字列が同じメモリ位置を指しているかどうかではなく、同じ文字が含まれているかどうかを確認します。

はい、テストのために常に使用されます。テストフレームワークは、これらのような比較に.equals()を使用する可能性が非常に高いです。

以下は、「文字列の等価性の誤り」を説明するリンクです。基本的に、Javaの文字列はオブジェクトであり、オブジェクトの等価性を比較する場合、通常はコンテンツではなくメモリアドレスに基づいて比較されます。このため、2つの文字列は、内容が同一であっても同じアドレスを占有しないため、印刷時に同じように見えても、正しく一致しません。

http://blog.enrii。 com / 2006/03/15 / java-string-equality-common-mistake /

public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}

JUnit assertEquals(obj1、obj2)は実際に obj1.equals(obj2)を呼び出します。

obj1 == obj2 を実行する assertSame(obj1、obj2)もあります(つまり、 obj1 および obj2 同じインスタンスを参照しています)、これは回避しようとしているものです。

これで大丈夫です。

  

" == 演算子は、2つの Objects がまったく同じ Object であるかどうかを確認します。"

http://leepoint.net/notes-java/data/strings /12stringcomparison.html

String はJavaの Object であるため、比較ルールのそのカテゴリに分類されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top