この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が正しい答えです。