DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

3章13

このJavaのコードには、2つのStringオブジェクトabが宣言されています。anew 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)
    }
}
Enter fullscreen mode Exit fullscreen mode
  • a == bは2つの参照が同じオブジェクトを指しているかをチェックします。これはfalseを返します、なぜならanewキーワードによってヒープ上に新しく生成されたオブジェクトを指し、bは文字列リテラルプール内の既存のオブジェクトを指しているからです。

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

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

Top comments (0)