Javaで「==」と「equals」を正しく使用する方法は何ですか?
Javaでは、==とequalsは両方ともオブジェクトを比較するための方法ですが、それらは異なる目的と挙動を持っています。
- 演算子:
- 基本データ型の比較は、値が等しいかどうかです。
- 参照データ型では、比較されるのはオブジェクトの参照が同じかどうかであり、つまり同じメモリアドレスを指しているかどうかです。
- 例えば、
- int a = 5, b = 5;
System.out.println(a == b); // 結果: trueString str1 = “hello”;
String str2 = “hello”;
String str3 = new String(“hello”);
System.out.println(str1 == str2); // 結果: true
System.out.println(str1 == str3); // 結果: false - equals() メソッド:
- 基本データ型に対しては、equals() メソッドはオーバーライドされず、引き続き == で比較されます。
- デフォルトでは、参照データ型の場合、equals()メソッドと==は同じで、参照が等しいかどうかを比較します。
- 通常は、オブジェクトの比較ロジックをカスタマイズするために、equals() メソッドをオーバーライドする必要があります。equals() メソッドをオーバーライドする際には、以下の条件を満たす必要があります。- 反射性:どんな非nullの参照 x に対しても、x.equals(x) はtrueを返すべきです。
– 対称性:どんな非nullの参照 x と y に対しても、x.equals(y) がtrueを返す場合、y.equals(x) もtrueを返すべきです。
– 推移性:どんな非nullの参照 x、y、z に対しても、x.equals(y) がtrueかつ y.equals(z) がtrueの場合、x.equals(z) もtrueを返すべきです。
– 一貫性:どんな非nullの参照 x、y に対しても、オブジェクトの情報が変更されていない場合、x.equals(y) を複数回呼び出しても同じ結果が返るべきです。
– どんな非nullの参照 x に対しても、x.equals(null) はfalseを返すべきです。 - 例えば、
- public class Person {
private String name;
private int age;// Constructor and other methods omitted@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
}→Personクラスでは、名前と年齢を比較するequalsメソッドが定義されています。
- 利用例:
- Person person1 = new Person(“Alice”, 20);
Person person2 = new Person(“Alice”, 20);
Person person3 = new Person(“Bob”, 25);System.out.println(person1.equals(person2)); // 結果 true
System.out.println(person1.equals(person3)); // 結果 false
まとめ:
- 基本データ型の値を比較するために使用され、また、参照データ型の参照が等しいかどうかを比較することもできます。
- equals()メソッドは、参照型データの値が等しいかどうかを比較するために使用されますが、具体的なビジネスロジックに基づいて再定義する必要があります。