【Java SE17 Silver 模擬試験】A-19

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

問題

次のコード断片について正しい説明はどれですか。

public class Main {
	public static void main(String[] args) {
		String s1 = new String("Duke");
		String s2 = s1;
		String s3 = s1.intern();
		String s4 = "Duke";
		if (s1 == s2)
			System.out.print("s1 == s2 | ");
		if (s1 == s3)
			System.out.print("s1 == s3 | ");
		if (s1 == s4)
			System.out.print("s1 == s4 | ");
		if (s2 == s3)
			System.out.print("s2 == s3 | ");
		if (s2 == s4)
			System.out.print("s2 == s4 | ");
		if (s3 == s4)
			System.out.print("s3 == s4 | ");
	}
}

選択肢

A)String オブジェクトは2つ作成され、s1 == s2 | s1== s3 | s2 == s3 | が出力される

B)String オブジェクトは1つだけ作成され、s1 == s2 | s1== s3 | s1 == s4 | s2 == s3 | s2 == s4 | s3 == s4 が出力される

C)String オブジェクトは2つ作成され、s1 == s2 | s1== s3 | が出力される

D)String オブジェクトは4つ作成され、何も出力されない

E)String オブジェクトは2つ作成され、s1 == s2 | s3== s4 | が出力される

F)String オブジェクトは3つ作成され、s1 == s2 | が出力される

解答

A)String オブジェクトは2つ作成され、s1 == s2 | s1== s3 | s2 == s3 | が出力される

B)String オブジェクトは1つだけ作成され、s1 == s2 | s1== s3 | s1 == s4 | s2 == s3 | s2 == s4 | s3 == s4 が出力される

C)String オブジェクトは2つ作成され、s1 == s2 | s1== s3 | が出力される

D)String オブジェクトは4つ作成され、何も出力されない

E)String オブジェクトは2つ作成され、s1 == s2 | s3== s4 | が出力される

F)String オブジェクトは3つ作成され、s1 == s2 | が出力される

解説

各選択肢の説明

  • s1new String("Duke") によって作成されます。これにより、"Duke" という内容を持つ 新しいヒープ上のオブジェクト が作成されます。
  • s2s1 を参照しているため、s1 と同じオブジェクトを指しています。
  • s3s1.intern() で、"Duke" の文字列プール上のオブジェクトを参照します。intern() は文字列プールに存在する文字列を返すため、プールにある “Duke” を参照します。
  • s4"Duke" リテラルです。リテラルは 文字列プール上のオブジェクト なので、s3 と同じオブジェクトを指します。

条件ごとの結果

  1. s1 == s2
    同じオブジェクトなので、true です。s1 == s2 | が出力されます。
  2. s1 == s3
    s1 はヒープ上のオブジェクトで、s3 は文字列プール上のオブジェクトなので、異なるオブジェクトを指し、false です。
  3. s1 == s4
    s1 はヒープ上のオブジェクトで、s4 は文字列プール上のオブジェクトなので、false です。
  4. s2 == s3
    s2s1 と同じヒープ上のオブジェクトで、s3 は文字列プール上のオブジェクトなので、false です。
  5. s2 == s4
    s2 はヒープ上のオブジェクトで、s4 は文字列プール上のオブジェクトなので、false です。
  6. s3 == s4
    s3s4 はどちらも文字列プール上の "Duke" を指しているので、true です。s3 == s4 | が出力されます。

結論

2つの文字列オブジェクトが作成され、出力されるのは s1 == s2 | s3 == s4 | です。

public class Main {
	public static void main(String[] args) {
		String s1 = new String("Duke");     //Stringオブジェクト1つ目
		String s2 = s1;
		String s3 = s1.intern();  //Stringオブジェクト2つ目 
                                                                //intern()は、同クラスのメモリ領域に同じ文字列が無いか探しに行くメソッド
                                                                //仮に同じ文字列が見つからなければ新たに文字列を生成
		String s4 = "Duke";
		if (s1 == s2)
			System.out.print("s1 == s2 | ");
		if (s1 == s3)
			System.out.print("s1 == s3 | ");
		if (s1 == s4)
			System.out.print("s1 == s4 | ");
		if (s2 == s3)
			System.out.print("s2 == s3 | ");
		if (s2 == s4)
			System.out.print("s2 == s4 | ");
		if (s3 == s4)
			System.out.print("s3 == s4 | ");
	}
}

前の問題へ SE17_A-18

次の問題へ SE17_A-20


対象資格:Java SE17 認定資格