0

重複の可能性:
Javaの文字列プールとは?

1. ==は、2 つのオブジェクトが同じメモリ位置を指しているかどうかをチェックし、equalsのデフォルト定義も==を使用してチェックを行うことを知っています。つまり、両方が同じであることを意味します。

2. Stringクラスは equals メソッドをオーバーライドして、2 つの文字列が同じ値かどうかをチェックします。

S1 = "test" および S2 = S1 と考えてください。

現在、S1 と S2 は 2 つの異なるオブジェクトであるため、ポイント 1 S1==S2falseであり、ポイント 2 S1.equals(S2)trueである必要がありますが、Eclipse でこの小さなプログラムを実行すると、両方とも true を返します。S1 == S2 も真であるという文字列オブジェクトに関する特別なことはありますか。

4

4 に答える 4

3

S1 = "test" および S2 = S1 と考えてください。S1 と S2 は 2 つの異なるオブジェクトです

いいえ。これはあなたの議論が失敗するところです。

1 つの文字列オブジェクトを作成し、両方の変数が同じ文字列オブジェクトを参照しています。代入は文字列の新しいコピーを作成しません。

于 2012-12-03T10:42:50.773 に答える
3

あなたが書くとき

s1 = s2;

s1s2は同じオブジェクトへの参照であるため、s1 == s2常に true を返します。

もっと紛らわしい - あなたが書いた場合:

s1 = "test";
s2 = "test";
s3 = new String("test");

s1 == s2それは本当ですが、s1 == s3間違っていることがわかります。これについては、この投稿で詳しく説明しています。

于 2012-12-03T10:43:03.087 に答える
2

S1 = S2 を設定すると、それらは同じオブジェクトを指します。

書き込み

String S1 = "test"
String S2 = "test"

今と同じ結果が得られます。これは、コンパイラの最適化によるものです。コンパイラは、不変の文字列クラスに気付くため、両方が同じインスタンスを使用するようにコードを最適化します。コンストラクターでそれらをインスタンス化することにより、彼に新しい文字列を強制的に作成させることができます

String s1  = new String("test");
String s2  = new String("test");
System.out.println(s1 == s2) // false
System.out.println(s1.equals(s2)) //true
于 2012-12-03T10:44:22.507 に答える
1

初期化すると

S2=S1 

どちらも同じメモリ位置を指しています。

試す

S1 = "test"; 
S2 = "test";

これはあなたに与えるでしょう

 S1==S2 //false
于 2012-12-03T10:45:52.870 に答える