equals()とhashCode()を同時に上書きしなければならない理由
2069 ワード
私たちがJAVAで自分のクラスを作成するとき、比較的一般的なオーバーライドはObjectのequals()メソッドとhashCode()メソッドをオーバーライドすることです.そうしないとObjectに違反する可能性が高い.hashCode()の共通の約束は,独自に構築したクラス構築を利用してHash化された集合の正常な動作を必要とする.重要な約束があります.
2つのオブジェクトがequalsメソッドを使用して比較が等しい場合、2つのオブジェクトは同じhashCodeを返す必要があります.
この点はよく理解されています.例えば、Setにとって、Setの特徴は要素が不要で繰り返してはいけないことです.では、この中のいわゆる重複の定義は、プログラマーがequalsを通じて定義する必要があります.equals()メソッドをカバーしている以上、重複の概念を定義しています.では、equals()がTrueを返すと、hashCode()は同じハッシュコードを返さなければならないことを意味します.
たとえば、
3つのケースがあります.
1.Userクラスのequals()メソッドとhashCode()が上書きされていない場合、falseを返します.setには2つのUserオブジェクトがあります.
2.Userクラスにequals()メソッドのみが上書きされている場合は、trueを返します.setには2つのUserオブジェクトがあります.
3.Userクラスにequals()とhashCode()メソッドが同時に上書きされている場合、trueを返します.setにはUserオブジェクトがあります.
equals()メソッドのみが上書きされている場合、2つのUserオブジェクトが等しいかどうかを比較するとtrueが返されますが、setには2つの重複するUserオブジェクトがあります.これにより、HashSetオブジェクトの使用中に問題が発生します.
2つのオブジェクトがequalsメソッドを使用して比較が等しい場合、2つのオブジェクトは同じhashCodeを返す必要があります.
この点はよく理解されています.例えば、Setにとって、Setの特徴は要素が不要で繰り返してはいけないことです.では、この中のいわゆる重複の定義は、プログラマーがequalsを通じて定義する必要があります.equals()メソッドをカバーしている以上、重複の概念を定義しています.では、equals()がTrueを返すと、hashCode()は同じハッシュコードを返さなければならないことを意味します.
たとえば、
1 User u1 = new User(1, "mike");
2 User u2 = new User(1, "mike");
3 Set set = new HashSet();
4 set.add(u1);
5 set.add(u2);
6 System.out.println(u1.equals(u2));
7 for (User u : set) {
8 System.out.println(u.getId() + u.getName());
9 }
3つのケースがあります.
1.Userクラスのequals()メソッドとhashCode()が上書きされていない場合、falseを返します.setには2つのUserオブジェクトがあります.
2.Userクラスにequals()メソッドのみが上書きされている場合は、trueを返します.setには2つのUserオブジェクトがあります.
3.Userクラスにequals()とhashCode()メソッドが同時に上書きされている場合、trueを返します.setにはUserオブジェクトがあります.
equals()メソッドのみが上書きされている場合、2つのUserオブジェクトが等しいかどうかを比較するとtrueが返されますが、setには2つの重複するUserオブジェクトがあります.これにより、HashSetオブジェクトの使用中に問題が発生します.