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
これだけ覚えておけば大丈夫です。

コメント