問題
次のコード断片について正しい説明はどれですか。
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 | が出力される
解説
各選択肢の説明
- s1 は
new String("Duke")
によって作成されます。これにより、"Duke"
という内容を持つ 新しいヒープ上のオブジェクト が作成されます。 - s2 は
s1
を参照しているため、s1 と同じオブジェクトを指しています。 - s3 は
s1.intern()
で、"Duke"
の文字列プール上のオブジェクトを参照します。intern()
は文字列プールに存在する文字列を返すため、プールにある “Duke” を参照します。 - s4 は
"Duke"
リテラルです。リテラルは 文字列プール上のオブジェクト なので、s3
と同じオブジェクトを指します。
条件ごとの結果
- s1 == s2
→ 同じオブジェクトなので、true
です。s1 == s2 |
が出力されます。 - s1 == s3
→s1
はヒープ上のオブジェクトで、s3
は文字列プール上のオブジェクトなので、異なるオブジェクトを指し、false
です。 - s1 == s4
→s1
はヒープ上のオブジェクトで、s4
は文字列プール上のオブジェクトなので、false
です。 - s2 == s3
→s2
はs1
と同じヒープ上のオブジェクトで、s3
は文字列プール上のオブジェクトなので、false
です。 - s2 == s4
→s2
はヒープ上のオブジェクトで、s4
は文字列プール上のオブジェクトなので、false
です。 - s3 == s4
→s3
とs4
はどちらも文字列プール上の"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 | ");
}
}
対象資格:Java SE17 認定資格