はじめに
Java を学び始めると必ず出てくる疑問が
「== と equals の違いって何?」 という話。
特に String の比較で "abc" == "abc" が true になったり false になったりして、
「なんで?」と混乱しがちです。
この記事では、やさしく・実務寄りに
== と equals の違いを整理していきます。
まずはコードを確認
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true(参照が同じ)
System.out.println(s1 == s3); // false(参照が違う)
System.out.println(s1.equals(s3)); // true(内容が同じ)コードのしくみを解説
== は「参照が同じかどうか」を比較する
Java の == は
プリミティブ型 → 値の比較
参照型 → 参照(住所)の比較
というルールがあります。
String は参照型なので、 == は 中身ではなく“住所”が同じかどうか を比較します。
String s1 = "hello";
String s2 = "hello";
s1 == s2 → true(同じ場所を指している)equals は「内容が同じかどうか」を比較する
s1.equals(s3)equals は オブジェクトの内容を比較 します。
- 文字列なら文字列の内容
- List なら要素
- 独自クラスなら equals をオーバーライドして比較内容を決める
実務では「内容比較したいときは equals」が基本です。
String は「文字列リテラルの共有(インターン)」がある
String s1 = "hello";
String s2 = "hello";Java は同じ文字列リテラルを
同じ場所にまとめて保存(インターン) するため、 s1 と s2 は同じ参照を指します。
そのため == が true になることがあります。
しかし new を使うと別物になります。
String s3 = new String("hello");
s1 == s3 → falseあわせて知っておきたいポイント
プリミティブ型は == で比較してOK
int a = 10;
int b = 10;
System.out.println(a == b); // trueプリミティブ型は値そのものを持つため、
== で問題ありません。
equals をオーバーライドしているクラスもある
- String
- Integer
- List
- Map
など、多くのクラスは equals を
「内容比較」になるように実装しています。
equalsIgnoreCase も便利
"Hello".equalsIgnoreCase("hello"); // true大文字・小文字を無視した比較ができます。
使うときに気をつけたいこと
- 参照型の比較に == を使わない(特に String)
- 内容比較は equals を使う
- String の == が true になるのは“たまたま”のことがある
- new String() を使うと参照が変わる
- プリミティブ型は == でOK
実務では「== で比較してバグになった」というケースが非常に多いです。
まとめ
== と equals の違い
- == → 参照比較(プリミティブは値比較)
- equals → 内容比較
String の注意点
- リテラルはインターンされるため == が true になることがある
- new String() は別の参照
- 内容比較は equals を使う

== と equals の違いは、 「参照を比べるのか」「内容を比べるのか」 この1点を押さえるだけで一気に理解が深まります。
Java Bronze の試験でも、実務のバグ調査でも、 ここを知っているだけで安心してコードが書けます。
あなたの学びが、次のステップにつながりますように。

== は“住所”、equals は“中身”。
このイメージを持っておくと、String ともっと仲良くなれるよ。

コメント