2013-05-22 4 views
5

私はKathy Sierraの本からSCJPのために勉強しています。文字列の章で 、これは質問です:System.out.printlnで使用される文字列も新しい不変オブジェクトを作成しますか?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
--------------------------- 
What's the output, and how many string objects and ref variables are created? 

出力は春の冬春夏であり、2つの参照変数があります、それは大丈夫です。

次に、8つの文字列オブジェクト(春、夏、春夏など)が作成されていますが、それらを参照するものがないために失われたオブジェクトも含まれています。

ただし、最後のsysoutのものは含まれていません。

私の質問は、最後のコード行で、s1とs2がスペースで連結されているため、新しいオブジェクトも作成されないのですか?または、単に表示するために文字列バッファに渡され、新しいオブジェクトを作成しませんか?

これは明らかに非常に基本的なもので、私は他の場所を見ていましたが、これに直接答えるものは何もありませんでした。私の理解から、新しいオブジェクトもそこに作成されるはずですが、私は試験を確実にする必要があります!思考?

ありがとうございました!

+2

上記のコードをコンパイルし、 'javap -c'に渡し、コンパイルするバイトコードを確認します。暗黙の 'StringBuffer'でなければなりません。最終的に' toString() 'が呼び出されます。 – millimoose

+2

(質問は、証明書に間違っているものと同じですが、参照変数が作成されることは何を意味しますか?それらはコンパイル時の構造であり、宣言されています。文字列リテラルが作成されたときから - 確かに文字列操作操作の結果よりも早く作成されているからです。) – millimoose

+0

@millimooseこれらの質問は、オブジェクトのインスタンス化、jvmとStringの定数:) – vikingsteve

答えて

5

最後のコード行では、s1とs2がスペースで連結されているため、これも新しいオブジェクトを作成しませんか?

はい、10番目の文字列が作成されます。

このコード自体は必ずしもであることに注意してください。 5文字列 - 同じJVMで数回実行すると、呼び出すたびに5つの新しい文字列が作成されます。文字列リテラルは、コードが実行されるたびにに新しい文字列を作成しません。 (同じ文字列オブジェクトは、例えば、"spring "たびに再利用される。)

あなたが与えてくれたコード内の10個の文字列があります

  • 5リテラル:「春」、「夏」は、 " 「冬」「
  • 5連結結果:s1 + "summer",s1.concat("fall "),s1 + winter(化合物割り当てあり)およびs1 + " " + s2

私がコメントしたように、コード中に現れる文字列リテラルは常には別の文字列を含まないありません。たとえば、考えてみます。 - リテラルのそれぞれに1つ、および連結のための1

String x = "Foo" + "Bar"; 

をあなたはそれが3つの文字列オブジェクトが関与することが予想されます。

String x = "FooBar"; 
+0

文字列定数プールにそれらが存在する場合、それらは正しく再作成されません。 5つの文字列を作成しませんか?最後のコード行にスペースを含める - "" 次に、本が意味することは、文字列オブジェクトを作成すると言いますか?それは9文字列オブジェクトを意味しますが、5文字列リテラルのみを意味しますか? –

+0

new()と言っていない限り、コピーが作成されます。 –

+0

@ nilay9999:あなたは絶対に正しいです。私は数え切れません。 10本の弦があります。 5つの連結結果( '' s1 + '' summer "'、 's1.concat(' '夏' '、' '夏' '' '' '' '' '' '' '' "fall") '、' s1 + winter'(複合代入付き)、 's1 +" "+ s2')を指定します。 –

2

私は、他に明確に質問anwserます:インスタンスが関与しているどのように多くの文字列をコンパイラがコンパイル時に連結を行い、そのコードが効果的であるため、実際には、それだけで、1を含み、次のコードスニペット:

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
  1. 文字列リテラル "春"
  2. 文字列リテラル "夏" の
  3. 連結s1と "夏"
  4. S2とS1文字列リテラル "冬"
  5. リテラルs1と "冬"
  6. 文字列の連結 "の
  7. 文字列リテラル "秋"
  8. S1の連結及び "秋"
  9. 連結"
  10. SYSOUTでs1とs2の連結合計で

ので、10。

+0

これはおかげさまで、Jon Skeetに彼の答えにこれを加えるように頼んでいます。非常に役立ちます。 –

+0

@AndrewMartin:OPが指摘しているように、 ""もあります - したがって合計で10です。私は初めてそれを逃した。 –

+0

@JonSkeet:おかしい、ちょうどその上に私の頭を傷つけていた。今や気分がいい、歓声。 –

関連する問題