Javaでequalsメソッドを書き換える
equalsメソッドを書き換える前に、equalsメソッドを書き換える理由と、equalsメソッドを書き換えることに関する約束について理解します.
一.なぜequalsメソッドを書き換えるのか.
ObjectクラスはJava内のすべてのクラスのベースクラスであり、Objectクラスのequalsメソッドは、あるオブジェクトが別のオブジェクトに等しいかどうかを検出するために使用されます.2つの参照が同じオブジェクトを指す場合、equalsはtrueを返し、そうでない場合falseを返します.Objectにおけるequalsメソッドは,実際には2つのオブジェクトのメモリアドレスが等しいかどうかを比較する.
Objectクラスのequalsメソッドは次のように定義されます.
実際の応用過程では,オブジェクトのメモリアドレスに関心を持たず,往々にして2つのオブジェクトの実際の状態を比較する必要があるため,equalsメソッドを書き換える必要がある.
二.equalsメソッドの書き換えに関する約束
1自己反転性:任意の参照値xに対して、x.equals(x)は必ずtrueである.
2対称性:任意の参照値xおよびyに対して、x.equals(y)がtrueを返すと、y.equals(x)も必ずtrueを返します.
3伝達性:任意の参照値x,y,zに対して、x.equals(y)がtrueを返し、y.equals(z)もtrueを返すと、x.equals(z)も必ずtrueを返します.
4コンシステンシ:任意の参照値xおよびyについて、equals比較に使用されるオブジェクト情報が変更されていない場合、x.equals(y)を複数回呼び出すと、trueがコンシステンシに返されるか、falseがコンシステンシに返される.
5非空性:任意の非空参照値xに対して、x.equals(null)は必ずfalseを返します.
三.equalsメソッドの書き換え
equalsメソッドを書き換える場合は、hashcodeメソッドを書き換えることが望ましい.そうしないと、2つの等しいオブジェクトでhashcodeが等しくない可能性がある.Peopleクラスを定義すると、Peopleクラスの属性name、age値が等しい場合、2つのPeopleクラスの実力が等しいとみなされ、Peopleクラスでequalsメソッドが書き換えられます.
まとめ:
書き換えは4つのステップに分けられます.
1.同一オブジェクトか否かを比較する.
2.対象がnullであるか否かを判断する.
3.比較する対象をObjectから具体的なタイプに変更する.
4.比較対象の関連する属性が等しいかどうか.
一.なぜequalsメソッドを書き換えるのか.
ObjectクラスはJava内のすべてのクラスのベースクラスであり、Objectクラスのequalsメソッドは、あるオブジェクトが別のオブジェクトに等しいかどうかを検出するために使用されます.2つの参照が同じオブジェクトを指す場合、equalsはtrueを返し、そうでない場合falseを返します.Objectにおけるequalsメソッドは,実際には2つのオブジェクトのメモリアドレスが等しいかどうかを比較する.
Objectクラスのequalsメソッドは次のように定義されます.
public boolean equals(Object obj) {
return (this == obj);
}
実際の応用過程では,オブジェクトのメモリアドレスに関心を持たず,往々にして2つのオブジェクトの実際の状態を比較する必要があるため,equalsメソッドを書き換える必要がある.
二.equalsメソッドの書き換えに関する約束
1自己反転性:任意の参照値xに対して、x.equals(x)は必ずtrueである.
2対称性:任意の参照値xおよびyに対して、x.equals(y)がtrueを返すと、y.equals(x)も必ずtrueを返します.
3伝達性:任意の参照値x,y,zに対して、x.equals(y)がtrueを返し、y.equals(z)もtrueを返すと、x.equals(z)も必ずtrueを返します.
4コンシステンシ:任意の参照値xおよびyについて、equals比較に使用されるオブジェクト情報が変更されていない場合、x.equals(y)を複数回呼び出すと、trueがコンシステンシに返されるか、falseがコンシステンシに返される.
5非空性:任意の非空参照値xに対して、x.equals(null)は必ずfalseを返します.
三.equalsメソッドの書き換え
equalsメソッドを書き換える場合は、hashcodeメソッドを書き換えることが望ましい.そうしないと、2つの等しいオブジェクトでhashcodeが等しくない可能性がある.Peopleクラスを定義すると、Peopleクラスの属性name、age値が等しい場合、2つのPeopleクラスの実力が等しいとみなされ、Peopleクラスでequalsメソッドが書き換えられます.
@Override
public boolean equals(Object obj) {
if(this == obj){ //
return true;
}
if(obj == null){ // null, false
return false;
}
//
if(!(obj instanceof People)){
return false;
}
// obj , 。
People p = (People)obj;
if((p.getName().equals(this.getName()))
&& (p.getAge() == this.getAge())){
return true;
}
return false;
}
まとめ:
書き換えは4つのステップに分けられます.
1.同一オブジェクトか否かを比較する.
2.対象がnullであるか否かを判断する.
3.比較する対象をObjectから具体的なタイプに変更する.
4.比較対象の関連する属性が等しいかどうか.