1

誰かが私にこれを説明できますか?

    String str1 = "123";
    String str2 = "123";
    assertSame(str1,str2); // works

    assertSame("1", new String("1")); // fails

最初のアサートは機能するのに、2 番目のアサートは機能しないのはなぜですか? 私には意味がありません。String の比較は行いませんでした (assertEquals() で行うべきでした) が、単なる Object の比較です。私の見解では、同じインスタンスを参照していないため、最初の assertSame(str1,str2) も失敗するはずです。

4

1 に答える 1

2

コンパイラは、リテラル "123" への両方の参照をバイトコードの定数プール内の同じエントリに抽出するため、それらは同一として扱われます。

ただし、"123" と new String("123") は別のオブジェクトですが、同じ文字が含まれているため、assertSame() は失敗します。assertEquals() はどちらの場合でも成功します。

于 2012-11-08T16:01:35.170 に答える