Java で2 つのオブジェクトの等価性を比較する方法
Javaでは、equals()メソッドを用いて、2つのオブジェクトが等しいかどうかを比較できます。このメソッドは、Objectクラスのメソッドであり、すべてのクラスはObjectクラスを継承しています。
基本的に、equals()メソッドは2つのオブジェクトの参照の等価性を比較し、つまり、同じメモリアドレスを指しているかどうかを指します。オブジェクトの内容の等価性を比較したい場合は、クラス内でequals()メソッドをオーバーライドする必要があり、一般的には、hashCode()メソッドも同時にオーバーライドする必要があります。
以下にequals()メソッドをオーバーライドした例を示します。
public class MyClass {
private String name;
private int age;
// 构造函数和其他方法省略
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
MyClass myObj = (MyClass) obj;
return age == myObj.age && Objects.equals(name, myObj.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
この例では、2 つのオブジェクトの `name` と `age` プロパティが等しいかどうかを比較するために `equals()` メソッドをオーバーライドします。`getClass()` メソッドを使用して 2 つのオブジェクトが同じクラスに属しているかどうかを確認してから、プロパティの値を 1 つずつ比較します。2 つのオブジェクトのプロパティ値がすべて等しい場合、それらは等しいと見なされます。
なお、equals()メソッドは次のような規則に従う。
- 反射性:x.equals(x)は常にtrueを返す
- 対称性: x.equals(y) が true を返す場合、y.equals(x) も必ず true を返すこと
- 推移性:x.equals(y)がtrueで、y.equals(z)がtrueなら、x.equals(z)もtrueとならなければならない。
- 一貫性:2つのオブジェクトで変更がなければx.equals(y)を何回呼び出しても同じ結果を返すはず
- 空でないこと: x.equals(null) は常に false を返さなければならない。
さらに、正確性を担保するため、たいてい hashCode() メソッドをオーバーライドする必要もあります。上記のサンプルでは、hashCode() の値を生成するために Objects.hash() メソッドを使用しています。このメソッドはオブジェクトの特性に基づくユニークなハッシュコードを生成します。