我试图使用set。所以我试过这种方式
HashSet set=new HashSet();
Points p1 = new Points(10, 20);
Points p2 = new Points(10, 20);
System.out.println(set.add(p1)); // output true
System.out.println(set.add(p2)); // output false
我知道我的第一个输出是真的,第二个输出是假的,因为Set不允许重复的元素。并且,我也知道Set通过使用equals(Object o)方法实现此目的。它来自带有以下签名的java Object类。
public boolean equals(Object o) {}
为了更深入地测试我编写了自己的类
class testSet{
private int x;
private int y;
public testSet(int xa, int ya){
this.x=xa;
this.y=ya;
}
@Override
public boolean equals(Object o){
if (o instanceof testSet){
testSet ts=(testSet)o;
return ts.x==this.x && ts.y==this.y;
}
return false;
}
}
现在我希望以下代码的行为与Point class
相同HashSet set=new HashSet();
testSet set_a=new testSet(3,4);
testSet set_b=new testSet(3,4);
System.out.println(set.add(set_a)); //output expected true
System.out.println(set.add(set_b)); //output expected false
所以我期待第一个输出是真的,第二个输出是假的。但对于这两种情况,它总是会回归真实。但确实为Point类工作。我尝试了以下两个Point实现
android.graphics.Point
java.awt.point
那我做错了什么?谢谢你的帮助。
答案 0 :(得分:15)
您需要覆盖hashCode
以及equals
。 hashCode
的一般契约是,如果两个对象相等(在equals
意义上),那么它们具有相同的哈希码。