
問題
次のコード断片について正しい説明はどれですか。
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 認定資格
