覆盖hashCode()不起作用

时间:2014-03-02 23:07:51

标签: java equals hashcode hashset

我正在尝试使用HashSet使类Point正常工作。这是我的Point类:

class Point {

    int x;
    int y;

    Point(int x, int y) {
        x = x;
        y = y;
    }

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + x;
        hash = hash * 31 + y;
        return hash;
    }

    @Override
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        }
        Point p = (Point) o;
        return x == p.x && y == p.y;
    }
}

当我测试它并做

    HashSet<Point> h = new HashSet<Point>();
    h.add(new Point(0, 0));
    Point g = new Point(0, 1);
    System.out.println(h.equals(g));
    System.out.println(h.contains(g));

输出就是这个

false
true

为什么我的hashCode不起作用?

1 个答案:

答案 0 :(得分:7)

Point(int x, int y) {
    x = x;
    y = y;
}

您正在为自身分配x(本地参数变量)。 y也是如此。这些都是无操作。

使用

Point(int x, int y) {
    this.x = x;
    this.y = y;
}

以便将参数值分配给字段。


正如others所指出的那样,你不应该这样做

Point p = (Point) o;

不知道o是否为Point。如果它不能分配给ClassCastException,它将抛出Point。而是使用

if (o instanceof Point)
    return false;

if (o.getClass() != Point.class) 
    return false;

在施法前。请注意,上述两种方法不相同。在大多数情况下,您可以使用第一种情况,但如果Point具有子类,则使用第二种情况。