我可以使用==运算符来比较Java中的Point对象吗?

时间:2011-07-31 00:45:48

标签: java object-comparison object-identity

我正在解决“破解编码面试”一书中的问题...... 我有一个疑问。问题是:

在二维平面上给出两个正方形,找到一条可以切割这两个正方形的直线 方块一半。

解决方案:任何穿过矩形中心的线都必须将其切成两半。因此,如果你画了 连接两个正方形的中心的线,它会切成两半。

   public class Square {
       public double left;
       public double top;
       public double bottom;
       public double right;
       public Square(double left, double top, double size) {
              this.left = left;
              this.top = top;
              this.bottom = top + size;
              this.right = left + size;
       }

       public Point middle() {
              return new Point((this.left + this.right) / 2,
                                           (this.top + this.bottom) / 2);
       }

       public Line cut(Square other) {
              Point middle_s = this.middle();
              Point middle_t = other.middle();
              if (middle_s == middle_t) {
                     return new Line(new Point(left, top),
                     new Point(right, bottom));
              } else {
                     return new Line(middle_s, middle_t);
              }
       }
}

但是现在怀疑是'=='运算符在cut方法中检查它们是否是同一个正方形的点。点不可变吗?请帮助我...... 提前谢谢。

3 个答案:

答案 0 :(得分:9)

Point是不可变的并不重要。重要的是==正在进行指针/引用比较。正在检查middle_smiddle_t是否引用相同的Object实例,而不是它们的内部字段是否相同。

您可能要做的是为equals()类实现/覆盖Point,以便它比较xy坐标,如果匹配则返回true 。然后,您可以通过if (middle_s.equals(middle_t))来比较您的积分。

当您覆盖equals()时,请务必相应地覆盖hashCode()

答案 1 :(得分:2)

Point是不可变的并不重要......真正的问题仍然存在。

重要的是你是否关心点对象的身份 - 无论它们是同一个实例 - 还是你关心点对象的

在这里,显然你关心点的价值,而不是它是哪个对象实例,所以你应该使用middle_s.equals(middle_t)

答案 2 :(得分:0)

JavaDocs开始,您可以使用equals方法比较两个Point对象。
另外:让我们看一下Android developer's page以获得更多解释:

  

将此实例与指定对象进行比较,并指出它们是否存在   是平等的。为了相等,o必须代表相同的对象   此实例使用特定于类的比较。一般合同   是这种比较应该是反身的,对称的,和   传递。此外,除null之外的任何对象引用都不等于null