文字列プーリングで本当に混乱しています
この状況で作成されるオブジェクトの数
String a=new String("Hi"); //1
String b=new String("Hi"); //2
String c="hi"; //3
2 番目と 3 番目の文字列の場合に 1 つのオブジェクトが作成されている場合、(a==b) の場合になぜ FALSE を返すのか...
(a==b) の場合に FALSE を返す理由
を使用しているnew String
ため、これらの s の新しいオブジェクト参照を取得していますString
。
コードを次のように変更することに注意してください
String a = "Hi"; //1
String b = "Hi"; //2
System.out.println(a == b);
印刷を行いますtrue
。
詳細説明:文字列プール
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))
ます。
そのオブジェクトは1つではありません。新しいキーワードを使用して文字列を作成しているため、jvmはこれらの文字列をヒープに作成するため、両方のオブジェクトのアドレスが異なります。
そして == オブジェクトのアドレスをチェックして、それが false を返す理由です。
String c="hi" の場合。
これは new を使用して作成されていないため、これらのリテラルは文字列プールに作成され、これらのリテラルには jvm によるインターンプロセスがあります。
もう1つ文字列がある場合 d="hi"; c==d は true を返します。
ここ、
String c = "Hi";
Javaで文字列リテラル用に提供される別のメモリである文字列リテラルプールに文字列リテラルを作成します。あなたが書くとき
String c = "Hi";
String d = "Hi";
これらは、文字列定数プールで同じリテラルを参照します。および == 演算子は、参照変数が同じオブジェクトを参照しているかどうかをチェックします
したがって、c == d は true を返します。