equals()とhashCode()を同時に上書きしなければならない理由

2069 ワード

私たちがJAVAで自分のクラスを作成するとき、比較的一般的なオーバーライドはObjectのequals()メソッドとhashCode()メソッドをオーバーライドすることです.そうしないとObjectに違反する可能性が高い.hashCode()の共通の約束は,独自に構築したクラス構築を利用してHash化された集合の正常な動作を必要とする.重要な約束があります.
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オブジェクトの使用中に問題が発生します.