Set不能使用重写的equals

时间:2012-02-03 19:20:07

标签: java object set equals hashset

我试图使用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 

那我做错了什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:15)

您需要覆盖hashCode以及equalshashCode的一般契约是,如果两个对象相等(在equals意义上),那么它们具有相同的哈希码。