Java のオブジェクトを比較する方法(equals() と == の違い)初心者でもわかる使い分けの基本
新人
「先輩、Javaでオブジェクトを比較するにはどうすればいいんですか?==とequals()ってどっちを使えばいいのか迷います…」
先輩
「その気持ち、すごくわかるよ。実は==とequals()は意味がぜんぜん違うんだ。今からやさしく説明するから、一緒に覚えていこう!」
新人
「違いがわかれば、もう迷わず使えそうです!」
先輩
「じゃあまずは、Javaでのオブジェクト比較の基本から見ていこう。」
1. オブジェクト比較の基本(== と equals() の違いって何?)
Javaでオブジェクトを比較するときに使うのが、==演算子とequals()メソッドです。この2つは見た目が似ていますが、比べている「中身」がまったく違います。
==は「同じ場所にあるオブジェクトかどうか(同じものを見ているか)」を比べる道具です。かんたんに言えば、同じ箱を指しているかどうかを確認する感じです。
一方、equals()は「中身が同じかどうか」を比べます。中身が同じなら違う箱でもOKというイメージです。
初心者向けにまとめると、
- == は「同じオブジェクト(アドレス)」かどうかを見る
- equals() は「中身の値」が同じかどうかを見る
この違いを意識しておくと、Javaのオブジェクト比較がグッとわかりやすくなります。
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() メソッドとは?中身の比較とはどういうこと?
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()は「データが同じかどうか」を調べるために使うのが基本です。
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() をオーバーライドする場合)
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 を混同しない)
Javaの初心者がつまずきやすいポイントのひとつが、==とequals()の違いを混同してしまうことです。見た目が似ているので、「どちらも同じような比較では?」と思ってしまうのは当然です。
しかし、この2つはまったく別の意味を持っています。
== は「同じ箱を見ているか(参照)」を比較し、equals() は「中身が同じか(値)」を比較します。
間違った使い方の例として、次のようなコードがよくあります。
String a = new String("ねこ");
String b = new String("ねこ");
if (a == b) {
System.out.println("同じです");
} else {
System.out.println("違います");
}
違います
このコードでは、同じ「ねこ」という文字列なのに、== を使ったため「違います」と判定されました。
初心者の方は、中身の値を比較したいときは、必ず equals() を使うというルールを覚えておきましょう。
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 を扱うときの注意点
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であってもエラーにならず、安全に比較できます。
初心者がJavaでequals()を使うときは、比較対象が null の可能性がある場合は、固定文字列.equals(変数)の形で書くようにしましょう。
このような小さな工夫が、エラーを防ぎ、安全で読みやすいコードにつながります。