
問題
次のコード断片を実行するとStringオブジェクトは何個生成されますか。
String s1 = "Java";
String s2 = new String("Java");
String s3 = "Java";
String s4 = new String("Java");
String s5 = s3;
String s6 = s4;
選択肢
A)4つ
B)6つ
C)3つ
D)1つ
E)2つ
F)5つ
解答
A)4つ
B)6つ
C)3つ
D)1つ
E)2つ
F)5つ
解説
String s1 = "Java"; // 1つのStringオブジェクトを生成(リテラルとしてプールに追加)
String s2 = new String("Java"); // 1つの新しいStringオブジェクトを生成(ヒープに追加)
String s3 = "Java"; // 既存のリテラル(s1と同じオブジェクトを指す)
String s4 = new String("Java"); // 1つの新しいStringオブジェクトを生成(ヒープに追加)
String s5 = s3; // s5はs3と同じオブジェクトを指す(s1とも同じ)
String s6 = s4; // s6はs4と同じオブジェクトを指す
各行の解説
String s1 = "Java";- リテラル
"Java"がプールに登録され、1つのStringオブジェクトが生成されます。このオブジェクトはs1変数によって参照されます。
- リテラル
String s2 = new String("Java");newキーワードを使って新しいStringオブジェクトがヒープメモリに生成されます。ここでは、再度"Java"というリテラルを使っていますが、これは新しいオブジェクトです。したがって、2つ目のStringオブジェクトが生成されます。このオブジェクトはs2変数によって参照されます。
String s3 = "Java";- ここで
"Java"というリテラルが再び使われますが、すでにプールに存在しているため、新しいStringオブジェクトは生成されません。したがって、s3もs1と同じオブジェクトを参照します。
- ここで
String s4 = new String("Java");- 再度
newキーワードを使って新しいStringオブジェクトが生成されます。これはs2とは別の新しいオブジェクトです。したがって、3つ目のStringオブジェクトが生成されます。このオブジェクトはs4変数によって参照されます。
- 再度
String s5 = s3;s5はs3を参照するため、新しいオブジェクトは生成されません。s5はs1およびs3と同じオブジェクトを指します。
String s6 = s4;s6はs4を参照しますが、ここでも新しいオブジェクトは生成されません。s6はs4と同じオブジェクトを指します。
まとめ
生成された String オブジェクトの合計は以下の通りです:
"Java"リテラル(プールに登録されたもの)から生成されたオブジェクト:1new String("Java")によって生成された新しいオブジェクト:2(s2とs4)
合計
最終的に、合計で 3つの String オブジェクトが生成されます。
- プールにあるリテラルオブジェクト:1
- ヒープにある新しいオブジェクト:2
したがって、正しい答えは 3つの String オブジェクトが生成されるということになります。したがって、合計で 3つ の String オブジェクトが生成されます。
対象資格:Java SE17 認定資格
