我正在尝试使用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不起作用?
答案 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
具有子类,则使用第二种情况。