Javaの==とequals()の本当の違いとは?初心者にもわかる図解付きで徹底解説

Java

はじめに

Javaを勉強していると、文字列やオブジェクトの比較で必ず登場する「==」と「equals()」。
なんとなく使っていて、「結局どっちを使えばいいの?」と迷った経験、ありませんか?

この記事では、「==」と「equals()」の本当の違いを、初心者でもわかりやすく、図やコード例を交えて徹底解説します。


1. 結論:==は「参照の比較」、equals()は「内容の比較」

比較方法意味主な使いどころ
==同じものかどうか(参照比較)インスタンスが完全に同一か確認したいとき
equals()中身が同じか(値の比較)値や状態が同じか確認したいとき

2. 例でサクッと確認してみよう

  • s1 == s2同じ文字列リテラルなので true
  • s1 == s3別のオブジェクトなので false
  • s1.equals(s3)内容が同じなので true

3. 図解:== と equals() の違い


4. Stringの場合の注意点:文字列プール

Javaの文字列は**文字列プール(String Pool)**という仕組みで管理されます。
同じリテラル(例:"Java")は、同じメモリ領域を共有します。

でも、newで作ると新しいインスタンスになります。


5. プリミティブ型と参照型で「==」の動作が違う!

型の種類== の比較対象
プリミティブ型値そのもの
参照型メモリアドレス(参照先)

6. equals()の中身をのぞいてみよう

全てのJavaオブジェクトは、Object クラスを継承しています。
その中に、equals() が定義されています。

つまり、デフォルトでは == と同じ挙動です。
ですが、StringInteger などは、equals()内容比較用にオーバーライドしています。


7. equals() を自作クラスで正しく使うには?

オリジナルのクラスで「中身が同じかどうか」を比較するには、equals()オーバーライドする必要があります。


8. equals() をオーバーライドするときの注意点

equals() をオーバーライドしたら、hashCode() もセットでオーバーライドしましょう!

これは、HashMapHashSet のようなコレクションで正しく動作させるために必須です。


9. まとめ:== と equals() の違い早見表

比較方法比較する内容主な用途
==参照(オブジェクトの場所)インスタンスが同じか確認したいとき
equals()内容(オブジェクトの中身)値が同じかどうか確認したいとき

10. よくあるミスとその回避法

❌ == を使って文字列を比較

これは参照比較なので、思ったように動作しないことが多いです。

✅ equals() を使おう

このように定数を先に書くとnullも回避できて、安全です。


📘 Javaをもっと深く理解したい方へ

このような「Javaの動作の本質」をしっかり理解したいなら、「絶対にJavaプログラマーになりたい人へ。」という書籍がおすすめです。

👉 絶対にJavaプログラマーになりたい人へ。


🎓 わからないことは「サイゼントアカデミー」で解決!

  • 現役エンジニアが丁寧に教えてくれる
  • コードレビューが受けられる
  • Javaに特化した転職サポートも充実

👉 サイゼントアカデミー


おわりに

「==」と「equals()」の違いは、Javaの理解度を測るひとつの分かれ道です。

この違いをしっかり理解しておくことで、バグの少ない、安全で読みやすいコードが書けるようになります!

コメント

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