問題
次のコード断片を実行すると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 認定資格