0

文字列プーリングで本当に混乱しています

この状況で作成されるオブジェクトの数

String a=new String("Hi"); //1
String b=new String("Hi"); //2
String c="hi"; //3

2 番目と 3 番目の文字列の場合に 1 つのオブジェクトが作成されている場合、(a==b) の場合になぜ FALSE を返すのか...

4

4 に答える 4

4

(a==b) の場合に FALSE を返す理由

を使用しているnew Stringため、これらの s の新しいオブジェクト参照を取得していますString

コードを次のように変更することに注意してください

String a = "Hi"; //1
String b = "Hi"; //2

System.out.println(a == b);印刷を行いますtrue

詳細説明:文字列プール

于 2013-06-10T06:48:50.287 に答える
2

Java では、非プリミティブ型の場合、==演算子は値ではなく参照を比較します。

次のような同等の文字列リテラルの束を作成する場合:

String sLit1 = "test";
String sLit2 = "test";

(sLit1 == sLit2)になりますtrue。Java は新しい文字列リテラルごとに新しいメモリを割り当てないため、メモリ内の同じ場所を指すだけです。ただし、String オブジェクトを作成すると、次のようになります。

String sObj = new String("test") 

Java は常に新しいオブジェクトを作成し、メモリ内の新しい場所を占有します。だからsLit1 == sObjいつもそうfalseです。

つまり、2 つの引数が同じオブジェクトを参照している場合にのみ==生成されます。true文字列を比較するには、 のようequalsにメソッドを使用し(sObj.equals(sLit1))ます。

于 2013-06-10T06:53:40.983 に答える
1

そのオブジェクトは1つではありません。新しいキーワードを使用して文字列を作成しているため、jvmはこれらの文字列をヒープに作成するため、両方のオブジェクトのアドレスが異なります。

そして == オブジェクトのアドレスをチェックして、それが false を返す理由です。

String c="hi" の場合。

これは new を使用して作成されていないため、これらのリテラルは文字列プールに作成され、これらのリテラルには jvm によるインターンプロセスがあります。

もう1つ文字列がある場合 d="hi"; c==d は true を返します。

于 2013-06-10T06:53:28.170 に答える
0

ここ、

String c = "Hi"; 

Javaで文字列リテラル用に提供される別のメモリである文字列リテラルプールに文字列リテラルを作成します。あなたが書くとき

String c = "Hi";
String d = "Hi";

これらは、文字列定数プールで同じリテラルを参照します。および == 演算子は、参照変数が同じオブジェクトを参照しているかどうかをチェックします

したがって、c == d は true を返します。

于 2013-06-10T06:54:39.160 に答える