私は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がスペースで連結されているため、新しいオブジェクトも作成されないのですか?または、単に表示するために文字列バッファに渡され、新しいオブジェクトを作成しませんか?
これは明らかに非常に基本的なもので、私は他の場所を見ていましたが、これに直接答えるものは何もありませんでした。私の理解から、新しいオブジェクトもそこに作成されるはずですが、私は試験を確実にする必要があります!思考?
ありがとうございました!
上記のコードをコンパイルし、 'javap -c'に渡し、コンパイルするバイトコードを確認します。暗黙の 'StringBuffer'でなければなりません。最終的に' toString() 'が呼び出されます。 – millimoose
(質問は、証明書に間違っているものと同じですが、参照変数が作成されることは何を意味しますか?それらはコンパイル時の構造であり、宣言されています。文字列リテラルが作成されたときから - 確かに文字列操作操作の結果よりも早く作成されているからです。) – millimoose
@millimooseこれらの質問は、オブジェクトのインスタンス化、jvmとStringの定数:) – vikingsteve