1

重複の可能性:
「==」を使用した 2 つの文字列の比較: いつ機能しますか?

次のコードがあります。

String s1 = new String("Test");
String s2 = new String("Test");

String s3 = "Test";
String s4 = "Test";

System.out.println(s1 == s2);
System.out.println(s3 == s4);

そして、次の出力が得られます。

false
true

2 番目の比較で が出力されるのはなぜtrueですか?

4

3 に答える 3

5

a を比較する正しい方法Stringは、

 s1.equals(s2)
  1. System.out.println(s1==s2)とがヒープ上の異なるオブジェクトを指しているfalseためです。s1s2

  2. System.out.println(s3==s4)とは、ヒープ上の同じオブジェクトを指しているオブジェクト参照であるtrueためです。s3s4

于 2012-05-23T18:05:24.333 に答える
3

それが質問に答えるかどうかはわかりませんが:

==参照(ポインタ)を比較するために使用されます

そのためs1==s2、文字列が同じかどうかをチェックしないでください。ただし、s1 と s2 が同じStringインスタンスであるかどうかはチェックしません。

equals同等性をチェックするには、次の関数を使用する必要があります。s1.equals(s2)

文字列は内部化されるため、動作は jvm に依存し、予測できません (ほとんどの実装が同じであっても)

于 2012-05-23T18:13:22.737 に答える
2

==Javaでは、常に「これら2つのものがメモリ内のオブジェクトの同じインスタンスを参照している場合はtrueを返す」という意味であることに注意することが重要です。

コンストラクターを使用して文字列を宣言する場合:

String s1 = new String("Foo");
String s2 = new String("Foo");

新しい文字列インスタンスは常に作成されます。これは、それらが同じ値を持ち、s1同じs2オブジェクトになることは決してないため、==falseを返すことを意味します。

ただし、定数文字列には特殊なケースがあります。このように文字列を宣言すると、次のようになります。

String s3 = "Foo";
String s4 = "Foo";

次に、単一の定数文字列が文字列プールに作成され、変数s3とs4の両方がメモリ最適化としてそれを指します。ただし、これは実装の詳細として扱う必要があります。それでも、比較は常にEqualsメソッドを使用して実行する必要があります。

于 2012-05-23T18:18:38.477 に答える