2

重複の可能性:
Java での文字列比較と文字列インターン

Java での文字列の比較について少し疑問があります。次のコードを検討してください。

if("String".replace('t','T') == "String".replace('t','T')) {
  System.out.println("true");
}
else {
  System.out.println("false");
}

上記のコードは常に 'sfalseを出力します。

if("STring" == "STring") {
  System.out.println("true");
}
else {
  System.out.println("false");
}

それは常に私を印刷しますtrueString.equals() or equalsIgnoreCase()はい、文字列の比較はメソッドで行う必要があることは知っています。しかし、これはインタビューで尋ねられた質問の1つであり、私は混乱しています. 誰でもこの動作について教えてもらえますか?

私の知る限り、コード スニペット 1 では"String.replace('t','T')オブジェクトが返されているため、オブジェクトの比較では false が返されます。私は正しいですか?

4

6 に答える 6

5

「String.replace('t','T') はオブジェクトを返すため、オブジェクトの比較は false を返します。そうですか?

はい、この場合に関しては、あなたは正しいです。String#replace(またはそのことについては String クラスの任意のメソッド) は、新しい String オブジェクトを返します (理由はわかりますか? Immutability )。したがって、equalsそれらの内容を比較するには、メソッドを使用して比較を行う必要があります。

さて、2番目のケースでは: -

"STring" == "STring"

2 つの文字列リテラルを比較しています。現在、文字列リテラルはJavaにインターンされているため、両方のリテラルは同じです(ある意味では、同じメモリ位置を指しています)。したがって、==比較するとtrue.

==と を使用した比較の違いはequals参照値==、つまりオブジェクトのメモリ位置の値を比較することです。これは、最初のケースのように、2 つの異なる文字列オブジェクトで異なります。一方、それらのオブジェクトの実際のコンテンツを比較します。equals

于 2013-01-08T07:41:57.650 に答える
4

「String.replace('t','T') はオブジェクトを返すため、オブジェクトの比較は false を返します。そうですか?

はい、==オブジェクト参照を比較します。最初のコードは 2 つの異なるオブジェクトを比較しています。

2番目のコードに関する限り、文字列のインターンが原因です。

于 2013-01-08T07:38:14.300 に答える
1

このようにしましょう。両方の文字列オブジェクト「文字列」が同じオブジェクトを参照しています。したがって、それらは「基本的に」等しいです。それはコンパイラがあなたのために行うことです

しかし、replace メソッドは新しい String オブジェクトを作成して返すため、2 番目のコードは等しくありません。

于 2013-01-08T07:42:46.727 に答える
0

Javaは、を使用するときに、オブジェクトの基本タイプ(、、など)または参照をint常にbyte比較ます==

Javaコンパイラは、入力した2つの文字列定数を最適化して、同じオブジェクト、つまり同じ参照を使用するため、==trueを返します。

于 2013-01-08T07:41:14.500 に答える
-1

このようにしてください

("String".replace('t','T').Tostring() ==  ("String".replace('t','T')).ToString()

これにより、問題が解決します。これは、replaceステートメントをeveluationの前に文字列に変換する必要があるためです。

String.Equalsを使用することもできます。これ以上の場合は、質問で言及したように大文字と小文字を区別しないでください。

于 2013-01-08T07:39:43.537 に答える
-1

これを試して:

if(string1.equals(string2)){

..。

}

于 2013-01-08T07:39:46.960 に答える