【Java SE17 Silver 模擬試験】B-52

Java SE17 Silver 模擬試験
Java SE17 Silver 模擬試験

問題

次のコード断片を実行すると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と同じオブジェクトを指す

各行の解説

  1. String s1 = "Java";
    • リテラル "Java" がプールに登録され、1つの String オブジェクトが生成されます。このオブジェクトは s1 変数によって参照されます。
  2. String s2 = new String("Java");
    • new キーワードを使って新しい String オブジェクトがヒープメモリに生成されます。ここでは、再度 "Java" というリテラルを使っていますが、これは新しいオブジェクトです。したがって、2つ目の String オブジェクトが生成されます。このオブジェクトは s2 変数によって参照されます。
  3. String s3 = "Java";
    • ここで "Java" というリテラルが再び使われますが、すでにプールに存在しているため、新しい String オブジェクトは生成されません。したがって、s3s1 と同じオブジェクトを参照します。
  4. String s4 = new String("Java");
    • 再度 new キーワードを使って新しい String オブジェクトが生成されます。これは s2 とは別の新しいオブジェクトです。したがって、3つ目の String オブジェクトが生成されます。このオブジェクトは s4 変数によって参照されます。
  5. String s5 = s3;
    • s5s3 を参照するため、新しいオブジェクトは生成されませんs5s1 および s3 と同じオブジェクトを指します。
  6. String s6 = s4;
    • s6s4 を参照しますが、ここでも新しいオブジェクトは生成されませんs6s4 と同じオブジェクトを指します。

まとめ

生成された String オブジェクトの合計は以下の通りです:

  • "Java" リテラル(プールに登録されたもの)から生成されたオブジェクト:1
  • new String("Java") によって生成された新しいオブジェクト:2s2s4

合計

最終的に、合計で 3つの String オブジェクトが生成されます。

  • プールにあるリテラルオブジェクト:1
  • ヒープにある新しいオブジェクト:2

したがって、正しい答えは 3つの String オブジェクトが生成されるということになります。したがって、合計で 3つString オブジェクトが生成されます。

前の問題へ SE17_B-51

次の問題へ SE17_B-53

対象資格:Java SE17 認定資格