カテゴリ: Javaのクラスとオブジェクト 更新日: 2025/05/25

Java のオブジェクトを比較する方法(equals() と == の違い)初心者でもわかる使い分けの基本

128
Java のオブジェクトを比較する方法(equals() と == の違い)

新人と先輩の会話形式で理解しよう

新人

「先輩、Javaでオブジェクトを比較するにはどうすればいいんですか?==equals()ってどっちを使えばいいのか迷います…」

先輩

「その気持ち、すごくわかるよ。実は==equals()は意味がぜんぜん違うんだ。今からやさしく説明するから、一緒に覚えていこう!」

新人

「違いがわかれば、もう迷わず使えそうです!」

先輩

「じゃあまずは、Javaでのオブジェクト比較の基本から見ていこう。」

1. オブジェクト比較の基本(== と equals() の違いって何?)

1. オブジェクト比較の基本(== と equals() の違いって何?)
1. オブジェクト比較の基本(== と equals() の違いって何?)

Javaでオブジェクトを比較するときに使うのが、==演算子equals()メソッドです。この2つは見た目が似ていますが、比べている「中身」がまったく違います。

==は「同じ場所にあるオブジェクトかどうか(同じものを見ているか)」を比べる道具です。かんたんに言えば、同じ箱を指しているかどうかを確認する感じです。

一方、equals()は「中身が同じかどうか」を比べます。中身が同じなら違う箱でもOKというイメージです。

初心者向けにまとめると、

  • == は「同じオブジェクト(アドレス)」かどうかを見る
  • equals() は「中身の値」が同じかどうかを見る

この違いを意識しておくと、Javaのオブジェクト比較がグッとわかりやすくなります。

2. == 演算子とは?参照の比較についてやさしく説明

2. == 演算子とは?参照の比較についてやさしく説明
2. == 演算子とは?参照の比較についてやさしく説明

Javaで==を使うと、「2つのオブジェクトが同じ場所を指しているか」を比べます。これはオブジェクトが保存されている場所(アドレス)が同じかどうかを見るものです。

では、==を使ったサンプルコードを見てみましょう。


public class Sample {
  public static void main(String[] args) {
    String a = new String("りんご");
    String b = new String("りんご");

    if (a == b) {
      System.out.println("aとbは同じです(==)");
    } else {
      System.out.println("aとbは違います(==)");
    }
  }
}

aとbは違います(==)

このように、文字列の中身が同じ「りんご」でも、==で比べると「違う」となります。なぜならnewで別々の場所に作ったオブジェクトだからです。

つまり、== はオブジェクトの中身ではなく、アドレスが同じかどうかを見るという点に注意が必要です。

もしまったく同じオブジェクトを2つの変数で指していた場合は、==でも「同じ」と判定されます。


public class Sample {
  public static void main(String[] args) {
    String a = "みかん";
    String b = "みかん";

    if (a == b) {
      System.out.println("aとbは同じです(==)");
    } else {
      System.out.println("aとbは違います(==)");
    }
  }
}

aとbは同じです(==)

これは、Javaが"みかん"という文字列を一度だけ作り、同じ場所を使い回しているためです。

初心者が==を使うときは、「中身」ではなく「場所」を比べているという意識を持つことがとても大切です。

この後は、equals()メソッドでの比較方法について、よりくわしく解説していきます。

3. equals() メソッドとは?中身の比較とはどういうこと?

3. equals() メソッドとは?中身の比較とはどういうこと?
3. equals() メソッドとは?中身の比較とはどういうこと?

Javaのequals()メソッドは、オブジェクトの「中身が同じかどうか」を調べるために使います。==ではアドレスを比べましたが、equals()は「内容」を見てくれるのがポイントです。

文字列の場合、equals()を使えば、同じ言葉であれば別々に作られた文字列でも「同じ」と判断されます。

では、実際にコードで見てみましょう。


public class Sample {
  public static void main(String[] args) {
    String a = new String("りんご");
    String b = new String("りんご");

    if (a.equals(b)) {
      System.out.println("aとbは同じです(equals)");
    } else {
      System.out.println("aとbは違います(equals)");
    }
  }
}

aとbは同じです(equals)

このように、equals()は文字列の中身が同じであれば「同じ」と判断してくれます。

初心者向けにまとめると、equals()は「データが同じかどうか」を調べるために使うのが基本です。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 文字列での比較の注意点(String の == と equals の違い)

4. 文字列での比較の注意点(String の == と equals の違い)
4. 文字列での比較の注意点(String の == と equals の違い)

Javaでよく使われるString型(文字列)は、==equals()の違いが特にはっきり出ます。初心者がもっとも間違いやすいポイントでもあります。

たとえば、newを使って文字列を作ると、それぞれ別の場所に保存されますが、equals()を使えば中身を比べてくれます。

逆に、==で比べると中身が同じでも「違う」となってしまうことがあるので注意しましょう。

  • == → 箱そのものを比較(同じ場所か)
  • equals() → 箱の中身を比較(値が同じか)

初心者は、文字列の比較には基本的にequals()を使う、と覚えておけば問題ありません。

間違いやすい書き方:


String name = new String("たろう");
if (name == "たろう") {
  System.out.println("同じ名前です");
} else {
  System.out.println("違う名前です");
}

違う名前です

正しい書き方:


String name = new String("たろう");
if (name.equals("たろう")) {
  System.out.println("同じ名前です");
} else {
  System.out.println("違う名前です");
}

同じ名前です

このように、文字列の比較ではequals()を使うことで、正しく中身を判定できます。

5. 自作クラスで比較してみよう(equals() をオーバーライドする場合)

5. 自作クラスで比較してみよう(equals() をオーバーライドする場合)
5. 自作クラスで比較してみよう(equals() をオーバーライドする場合)

Javaでは、equals()メソッドを自分で作ったクラスでも使うことができます。ただし、そのままでは==と同じ動きをしてしまうので、中身を比べるように書き直す必要があります。

これを「equals() のオーバーライド」といいます。初心者でも使いやすいように、簡単な例で説明します。


public class Person {
  String name;

  Person(String name) {
    this.name = name;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof Person) {
      Person other = (Person) obj;
      return this.name.equals(other.name);
    }
    return false;
  }
}

public class Main {
  public static void main(String[] args) {
    Person p1 = new Person("さくら");
    Person p2 = new Person("さくら");

    if (p1.equals(p2)) {
      System.out.println("同じ名前の人です");
    } else {
      System.out.println("違う人です");
    }
  }
}

同じ名前の人です

このように、equals()をオーバーライドすることで、自作クラスでも中身を比較できるようになります。

Javaで本格的なプログラムを書くようになると、自作クラスでの比較はよく使います。初心者のうちから、equals()の使い方と意味をしっかり理解しておくと安心です。

6. よくある間違いと注意点(== と equals を混同しない)

6. よくある間違いと注意点(== と equals を混同しない)
6. よくある間違いと注意点(== と equals を混同しない)

Javaの初心者がつまずきやすいポイントのひとつが、==equals()の違いを混同してしまうことです。見た目が似ているので、「どちらも同じような比較では?」と思ってしまうのは当然です。

しかし、この2つはまったく別の意味を持っています。

== は「同じ箱を見ているか(参照)」を比較し、equals() は「中身が同じか(値)」を比較します。

間違った使い方の例として、次のようなコードがよくあります。


String a = new String("ねこ");
String b = new String("ねこ");

if (a == b) {
  System.out.println("同じです");
} else {
  System.out.println("違います");
}

違います

このコードでは、同じ「ねこ」という文字列なのに、== を使ったため「違います」と判定されました。

初心者の方は、中身の値を比較したいときは、必ず equals() を使うというルールを覚えておきましょう。

7. 実際に使い分けてみよう(ケース別のおすすめの使い方)

7. 実際に使い分けてみよう(ケース別のおすすめの使い方)
7. 実際に使い分けてみよう(ケース別のおすすめの使い方)

Javaでの==equals()の使い分けは、場面によって適した方法を選ぶことが大切です。ここでは、初心者が混乱しないように、ケースごとにおすすめの使い方を紹介します。

  • 数値型や真偽値(int, boolean など)→ == を使う
  • 文字列(String)やオブジェクト → equals() を使う
  • 同じオブジェクトかどうかをチェック → ==

以下の例では、2人のユーザー情報を比べて、同じオブジェクトか、中身が同じかを判定します。


public class User {
  String name;

  User(String name) {
    this.name = name;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof User) {
      User other = (User) obj;
      return this.name.equals(other.name);
    }
    return false;
  }
}

public class Main {
  public static void main(String[] args) {
    User u1 = new User("ゆうき");
    User u2 = new User("ゆうき");
    User u3 = u1;

    System.out.println(u1 == u2); // false(違うオブジェクト)
    System.out.println(u1.equals(u2)); // true(中身が同じ)

    System.out.println(u1 == u3); // true(同じオブジェクト)
  }
}

false
true
true

このように、同じ名前のユーザーでも、==では違うとされることがあります。中身を比較したいならequals()、同一のオブジェクトかを知りたいなら==と覚えておくと使い分けがスムーズです。

8. equals() の中で null を扱うときの注意点

8. equals() の中で null を扱うときの注意点
8. equals() の中で null を扱うときの注意点

equals()を使うときに気をつけたいポイントがもうひとつあります。それがnullとの比較です。

nullは何も入っていない状態なので、間違って null.equals(〜) と書いてしまうとエラーが出てしまいます。

たとえば次のコードは、実行時にNullPointerExceptionというエラーになります。


String name = null;

if (name.equals("さくら")) {
  System.out.println("同じ名前です");
}

このようなエラーを避けるには、equals() を呼び出す側にリテラル(固定の値)を書くことがポイントです。


String name = null;

if ("さくら".equals(name)) {
  System.out.println("同じ名前です");
} else {
  System.out.println("違う名前です");
}

違う名前です

この書き方なら、nullであってもエラーにならず、安全に比較できます。

初心者がJavaequals()を使うときは、比較対象が null の可能性がある場合は、固定文字列.equals(変数)の形で書くようにしましょう。

このような小さな工夫が、エラーを防ぎ、安全で読みやすいコードにつながります。

Javaのクラスとオブジェクトの一覧へ
新着記事
FlutterのMVP・MVVMアーキテクチャの違いと使い分け
FlutterのMVP・MVVMアーキテクチャの違いと使い分けを初心者向けに解説!
オニオンアーキテクチャの基本とFlutterでの適用例
オニオンアーキテクチャの基本とFlutterでの適用例を初心者向けに解説
クリーンアーキテクチャとは?Flutterでの導入メリット
クリーンアーキテクチャとは?Flutterでの導入メリットをやさしく解説
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金まとめ
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金を初心者向けに徹底解説
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク