3章13

RMAG news

このJavaのコードには、2つのStringオブジェクトaとbが宣言されています。aはnew String(“sample”)を使用してヒープに新しいオブジェクトとして作成され、bは文字列リテラル”sample”を参照しています。Javaにおいて文字列リテラルは、同じ内容の文字列リテラルがあれば常に同じインスタンスを参照するため、文字列リテラルはプールされます。これにより、bはリテラルプール内のインスタンスを参照しますが、aは新しく作成された別のインスタンスを参照しています。

コードの解析を行い、そのプロセスにコメントを加えて説明します。

public class Main {
public static void main(String[] args) {
String a = new String(“sample”); // ヒープに新しいStringオブジェクトを作成
String b = “sample”; // 文字列リテラルプールからStringオブジェクトを参照

System.out.print(a == b); // 参照の同一性をチェック(false)
System.out.print(“, “);
System.out.println(a.equals(b)); // 値の同一性をチェック(true)
}
}

a == bは2つの参照が同じオブジェクトを指しているかをチェックします。これはfalseを返します、なぜならaはnewキーワードによってヒープ上に新しく生成されたオブジェクトを指し、bは文字列リテラルプール内の既存のオブジェクトを指しているからです。

a.equals(b)は2つのStringオブジェクトの内容が等しいかをチェックします。この場合、aとbの両方が同じ文字列”sample”を含んでいるため、trueを返します。

したがって、このコードは出力として[false, true]を返し、選択肢Aが正しい答えです。

Leave a Reply

Your email address will not be published. Required fields are marked *