作成されるStringオブジェクトの数
私はSCJPのために勉強していますが、この文字列の問題に頭を悩ませることはできないようです。質問の見方によっては、いくつかの答えが考えられるようです。
次の初期化では、いくつの文字列オブジェクトが作成されますか?
String s1 = "A" + "B" + "C" + "D";
System.out.println(s1)
最初は5つのオブジェクトを考えました。
"A"
"B"
"C"
"D"
"ABCD"
しかし、それについて考えると、たとえばコンパイラ"A" + "B"
が1つのオブジェクトとして連結されるため、よくわかりません。つまり、7つのオブジェクトを作成しますか?
"A"
"B"
"C"
"D"
"AB"
"ABC"
"ABCD"
また、コードが次のように変更された場合に作成されるオブジェクトの数
String s1 = new String("A" + "B" + "C" + "D");
System.out.println(s1);
そして最後にどうですか:
String s1 = "A";
String s2 = new String("A");
上記の例では、2つのオブジェクトのみが作成されると思います
object 1 - "A"
object 2 - a String object that refers to the "A" object above.
これは正しいですか、それとも関連していませんか?つまり、定数プールから参照されるオブジェクトは、s2参照によって参照されるオブジェクトとは異なります。
ありがとう
編集
また、最終的に定数プールに入れられるオブジェクトだけでなく、破棄されるオブジェクトも含めて、作成されたオブジェクトの総数を知りたいことに注意してください。
編集
ジョンの答えを見ると、オブジェクトの作成方法を完全に誤解している可能性があります。文字列は定数プールで1回だけ作成され、再利用されることは知っていますが、「final」文字列が作成されるときに実行されるプロセスがわかりません。これが私が読んでいる本のセクションで、ここでの答えとは正反対の一時的なオブジェクトが作成されることを示唆しているようです。(または、本が間違っているか、私が本を誤解している可能性があります)
コードサンプルは
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1 + " " + s2);
質問は
出力は何ですか?追加のクレジットとして、printlnステートメントの前に作成されたStringオブジェクトの数と参照変数の数。
そして答えは
このコードフラグメントの結果はです
spring water spring summer
。s1とs2の2つの参照変数があります。「春」、「夏」(失われた)、「春夏」、「滝」(失われた)、「春秋」(失われた)、「春夏春」(失われた)の合計8つのStringオブジェクトが作成されました。 、"winter"(失われた)、 "spring winter"(この時点で "spring"は失われます)。このプロセスで失われないのは、8つのStringオブジェクトのうち2つだけです。
ありがとう