が含まれている私のコードです:その仕様にmentionnedとしてHashSetのは、ここでの方法、奇妙な行動
public class testGui {
public static void main(String[] arg){
class TESTS{
String t;
public TESTS(String t){
this.t = t;
}
@Override
public boolean equals(Object x){
System.out.println("My method is called...");
if(x instanceof TESTS){
TESTS zzz = (TESTS) x;
return zzz.t.compareTo(t)==0;
}
else return false;
}
}
HashSet<TESTS> allItems = new HashSet<TESTS>();
allItems.add(new TESTS("a"));
allItems.add(new TESTS("a"));
System.out.println(allItems.contains(new TESTS("a")));
}
}
HashSetのメソッドが含まれている理由は、私は得ることはありませんが、私のequalsメソッドを呼び出していません。
より正式にこれは は、いかなる要素eが含まれていない設定した場合、このセットには、O、指定 要素を追加し、その (O == NULL E == NULL:o.equals(e)参照)
私のコードはfalseを返すので、私のequalsメソッドには入っていません。
お返事ありがとうございます!
これらは等しくないとはみなされません。 HashSetはequalsメソッドを呼び出すことさえしません。なぜなら、同じバケットにつながるhashCodeのためだけであるからです。また、hashCodeだけをオーバーライドすることは意味がありません。なぜならHashSetは常に同じhashCodesを持つオブジェクトに対してequalsを呼び出すからです。 –
@JB、はい、異なるバケットにつながるということは、それらが「不等」(異なるオブジェクトとみなされる)とみなされることを意味します。私はその用語を使用するときに 'equals'メソッドを参照しているわけではありません。私はまた、 'hashCode'だけをオーバーライドすることは非論理的であることに同意します。それが私がそれに対して強く勧めている理由です。しかし、それは契約を破ることはありません。 –
Javaのマニュアルでhashcodeが最初に呼び出されたと書かれていれば、うれしいでしょう。私はちょうどこの問題でJava 5で燃えてしまった。 – Aaron