java string 比較 == と equals の違いを超初心者向けに解説

この記事は約3分で読めます。
記事内に広告が含まれています。

Javaを学び始めたときに、多くの人が一度は迷うのが

文字列の比較は「==」と「equals」どっちを使えばいいの?

という疑問です。

まずは結論からいきます。


✅ 結論

文字列の中身を比べたいときは equals を使います。

  • == → 「同じ箱かどうか」を比べる
  • equals → 「中身が同じか」を比べる

ほとんどの場合、使うのは equals です。


そもそも「==」って何を比べてるの?

Javaでは、変数は「データそのもの」ではなく、
データが入っている場所(箱)を指していることがあります。

== は、その「箱が同じかどうか」を比べています。

つまり、

  • 中身が同じでも
  • 別の箱に入っていたら

== は false になります。


equals は何をしているの?

equals は、箱の中身(文字列の内容)を比べます。

たとえば、

String a = "hello";
String b = "hello";

このとき、

System.out.println(a.equals(b));

true になります。

中身が同じだからです。


実際のコードで見てみよう

String a = "hello";
String b = "hello";

System.out.println(a == b);      // true
System.out.println(a.equals(b)); // true

String c = new String("hello");

System.out.println(a == c);      // false
System.out.println(a.equals(c)); // true

なぜ a == c は false になるの?

new String("hello") を使うと、
新しい箱が作られます。

中身は同じでも、箱が違うので == は false になります。

でも中身は同じなので、equals は true になります。


よくあるミス:null のとき

次のコードはエラーになります。

String str = null;
System.out.println(str.equals("hello"));

str が null なので、
equals を呼び出すことができず
NullPointerException が発生します。


安全な書き方

方法①:文字列リテラル側から呼ぶ

System.out.println("hello".equals(str));

方法②:Objects.equals を使う

import java.util.Objects;

System.out.println(Objects.equals(str, "hello"));

Objects.equals は null でも安全に比較できます。


まとめ

  • 文字列の中身を比べるなら equals
  • == は箱(参照)を比べている
  • null の可能性があるなら Objects.equals を使う

迷ったらこう覚えてください。

中身を見るなら equals

これだけ覚えておけば大丈夫です。

コメント

タイトルとURLをコピーしました