(String編)if文の「==」と「equals」の違い

java

ifでよく使う比較演算子の「==」と「equals」についておさらいしています。「==」と「equals」の違いについては理解しているけど、たまに「あれ?」っていう場面に出くわしたことはありませんか?私はたまにあります(笑)。
今回は、「==」と「equals」について一度整理していこうと考えて、「==」と「equals」の違いと使える場面についてまとめてみました。

[スポンサーリンク]

目次

  1. 文字列を「==」で比較してみる。失敗するケース
  2. 文字列を「==」で比較してみる。成功するケース

文字列を「==」で比較してみる。失敗するケース

    public static void main(String arg[]) {

        String str = new String("目玉焼き");

        if ("目玉焼き" == str) {
            System.out.println("str は 目玉焼き です。");
        } else if ("ハンバーグ" == str) {
            System.out.println("str は ハンバーグ です。");
        } else {
            System.out.println("str は 目玉焼きとハンバーグ 以外です。");
        }

    }

実行結果

>実行結果
str は 目玉焼きとハンバーグ 以外です。

解説

一見上手くif文に入りそうなソースですが、「"目玉焼き" == str」にひっかからなかった(trueにならなかった)ですね。

これは、「==」が値を比較しているからイコールにはならないのです。
intやlongのプリミティブ型とは違って、Stringはオブジェクト型になります。

ここがポイントです。
オブジェクト型は参照型といわれています。
オブジェクト自体は値(目玉焼き)ではなく、値(目玉焼き)のアドレス(住所のようなもの)が入ります。
サンプルソースでは、"目玉焼き"とアドレス(住所のようなもの)を比較しているので、イコールにはならないのですね。

ここもポイントです。
それに対して、「equals」はオブジェクトのアドレス先(目玉焼き)と対象の文字を比較するので、比較は成功します。
「equals」を使うことで、「"目玉焼き" == "目玉焼き"」の比較が実現するのです。

文字列を「==」で比較してみる。成功するケース

では、Stringをnewせずに値を入れた場合はどうでしょうか。
3行目を見てください。
上のプログラムとは違い、Stringをnewせずに値を直接代入しています。

    public static void main(String arg[]) {

        String str = "目玉焼き";

        if ("目玉焼き" == str) {
            System.out.println("str は 目玉焼き です。");
        } else if ("ハンバーグ" == str) {
            System.out.println("str は ハンバーグ です。");
        } else {
            System.out.println("str は 目玉焼きとハンバーグ 以外です。");
        }

    }

実行結果

>実行結果
str は 目玉焼き です。

解説

今回は、「"目玉焼き" == str」にひっかりました(trueになりました!)
Stringをnewせずに値を直接入れた場合、これは変数strにアドレスではなく"目玉焼き"が代入されるので比較した時にtrueとなります。
Stringをnewせずに直接値をいれるたら、擬似プリミティブとして扱われるので、「==」でもtrueになります。

最後に

基本的には、
・文字列(オブジェクト型)は、「equals」で比較する。
・数値(プリミティブ型)は、「==」で比較する。

Stringをインスタンス化しなくても(擬似プリミティブでも)「==」ではなく「equals」を使いましょう。
Stringに対して「==」で比較しているプログラムを見たら普通の人ならびっくりします。(笑)

ごく稀に「==」で動作しているプログラムにお目にかかることがあると思いますが、仕組みをキチンと理解しておけば、「あぁ、なるほどなぁ」と納得できます。

続きは

続いての章では、
if文に続く基本的な構文、for文について解説していきます。
「Javaの繰り返し」(for、while)