如何检查值的相等性?

3
我是一名Java初学者,希望您能耐心看完这篇文章。
我有一个类:
class Point {
  public int x;
  public int y;

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

我创建了两个实例:

Point a = new Point(1, 1);
Point b = new Point(1, 1);

我想检查这两个点是否在同一位置。显而易见的方法,if (a == b) { ... },不能用于此处,因为这似乎是一个“对象是否相等”的测试,而这不是我想要的。
我可以使用以下代码:if ( (a.x == b.x) && (a.y == b.y) ) { ... },但这种解决方案并不好。
有什么优雅的方法可以取两个Point对象,并以坐标方式进行等式测试?

一个好的开始是阅读JDK中已经存在的代码。 - Peter Lawrey
2个回答

10

标准协议是实现equals()方法:

class Point {
  ...
  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof Point)) return false;
    Point rhs = (Point)obj;
    return x == rhs.x && y == rhs.y;
}

然后你可以使用 a.equals(b)
请注意,一旦完成此操作,您还需要实现 hashCode() 方法。
对于像您的类这样的类,我经常使用 Apache Commons LangEqualsBuilderHashCodeBuilder
class Point {
  ...

  @Override
  public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
  }

  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
  }
}

1
当使用instanceof时,您不需要进行null检查,如果其参数为null,它只会返回false - Neet
谢谢,这个方法很实用。我只是在想,我是否需要在重写的 hashCode() 函数中采用一些花哨的方法,还是像这样简单地写就可以:return (this.x * 1000) + (this.y * -1000)。其中 x 和 y 都将在 0-500 范围内,且不为负数。 - bos
@bos 然后一个简单的 return this.x * 1000 + this.y; 将会得到一个唯一的哈希值。@aix 当我写另一个 equals 时,我总是要提醒自己这个事实。 - Neet
1
@bos:完全可以。主要要求是无论何时equals()返回两个对象相等,这两个对象的哈希码必须相同。您的函数满足了这一点。 - NPE

0
你需要覆盖hashCode()和equals()方法。如果你正在使用Eclipse,可以通过进入“Source -> Generate hashCode() and equals()..”来让Eclipse自动完成这一过程。在你覆盖这些方法之后,你可以调用:
if(a.equals(b)) { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接