【保存版】Javaでよく使われるファイルの読み書き方法まとめ
勉強ちゃん
いろいろ勉強
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")
のように書くと a
が null
の場合 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()
:中身(値)の比較equals()
をオーバーライド済み"test".equals(obj)
のように書くと安全🎯 Java面接の基本中の基本なので、コードと一緒に覚えましょう!