以下のコードを実行すると、出力は2になります。これは、セットに2つの要素が含まれていることを意味します。ただし、両方のオブジェクトはhashcode()値と.equals()
メソッドに基づいて等しいため、セットには1が含まれている必要があると思います。私の理解に明らかな間違いがあるようですが?
package HELLO;
import Java.util.HashSet;
import Java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
public int hashcode() {
return a;
}
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
public String toString() {
return "Alpha : " + a;
}
}
あなたのハッシュcodeメソッドはObjectクラスのハッシュをオーバーライドしませんCodeメソッドは、hashCodeの結果と一致しないため、equalsメソッドはコントラクトを壊し、「等しい」が、異なるhashCodeを持つオブジェクトを持つことができます。
覚えておいてください:常に@Override
アノテーションは、メソッドをオーバーライドするときに、このエラーや同様のエラーをキャッチするのに役立ちます。
@Override // ** don't forget this annotation
public int hashCode() { // *** note capitalization of the "C"
return a;
}
また、特にレビューのためにここにコードを投稿する場合は、コードのフォーマットを改善する必要があります。私たちはあなたのコードをよりよく理解し、それが標準に準拠しているならあなたを助けることができます(それが標準が存在する理由です)。したがって、インデントを、同じブロックで同じレベルでインデントされているすべてのコード行と一致させるようにしてください。インポート、外部クラス宣言、その終了中かっこなど、ベースレベルのコードが左揃えになるようにしてください。 :
import Java.util.HashSet;
import Java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
@Override
public int hashCode() {
return a;
}
public String toString() {
return "Alpha : " + a;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Alpha other = (Alpha) obj;
if (a != other.a)
return false;
return true;
}
}
これに関する美しいレビューについては、次をお読みください: JavaでのequalsとhashCodeのオーバーライド
あなたのメソッドhashcodeはhashCode(大文字の "C")という名前にする必要があります。
メソッドのオーバーライドを計画している場合は、@Override
アノテーション。
そのアノテーションを使用した場合は、コードがコンパイルされなかったため、以前に問題に気づいたでしょう。
@Overridesアノテーションは、スーパークラスで同じ名前のメソッドをオーバーライドするためのものです。」.
@Override
public int hashCode() {
return a;
}
@Override
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
@Override
public String toString() {
return "Alpha : " + a;
}