Java

【頻出】Javaで == と equals() の違いを説明できますか?

勉強ちゃん

Javaの面接で非常によく聞かれる質問の1つがこれです。

==equals() の違いを説明してください」

曖昧なまま答えてしまうと、「Javaのオブジェクトの基本を理解していない」と評価されてしまう可能性があります。
今回は、違いを明確に整理し、面接で自信を持って説明できるようになることを目指します。

✅ 結論から言うと

比較方法比較対象用途
==参照(アドレス)同じオブジェクトかどうかを比較
equals()中身(値)同じ内容かどうかを比較

💡 例で理解する

String a = new String("hello");
String b = new String("hello");

System.out.println(a == b); // false
System.out.println(a.equals(b)); // true

解説:

  • a == b「aとbが同じオブジェクトか」 を見ており、これはfalse
  • a.equals(b)「aとbの中身(文字列)が同じか」 を見ており、これはtrue

🔎 なぜ違うのか?

== は「参照先のアドレス」を比較

Javaでは、オブジェクトを変数に代入すると「そのオブジェクトの参照(アドレス)」が保持されます。
そのため、== は「同じオブジェクトか(同じ参照か)」を調べます。

equals() は「中身の比較」

Objectクラスに定義されている equals() は、元々 == と同じ動作をしますが、
多くのクラス(例:String, Listなど)はこのメソッドをオーバーライドして、中身の比較を行うようになっています。


⚠️ 注意点

  • equals() を使うときは nullチェックを忘れずに!
String a = null;
if ("test".equals(a)) { // 安全(逆に書く)
...
}

a.equals("test") のように書くと anull の場合 NullPointerException が発生します。


👨‍💻 補足:自作クラスでの比較

自分で作ったクラスも、equals()を正しく動かすにはオーバーライドが必要です。

public class Person {
String name;

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

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person other = (Person) obj;
return Objects.equals(this.name, other.name);
}
}

📝 面接での答え方(例)

== は参照(アドレス)の比較で、equals() は中身の比較です。例えばStringでは、==だとfalseでもequals()はtrueになることがあります。また、自作クラスで中身を比較したい場合は、equals()をオーバーライドする必要があります。」


✅ まとめ

  • ==:同一オブジェクト(参照)の比較
  • equals():中身(値)の比較
  • Stringやラッパークラスなどは equals() をオーバーライド済み
  • nullチェックは "test".equals(obj) のように書くと安全

🎯 Java面接の基本中の基本なので、コードと一緒に覚えましょう!

ABOUT ME
自己紹介
自己紹介
職業:Web開発エンジニア
こんにちは!
このブログでは、ITのお仕事で学んだ知識や、 日本での生活で学んだ知識を紹介しています。
お役に立てればうれしいです 😊
記事URLをコピーしました