【问题标题】:Can I use the == operator to compare Point objects in Java?我可以使用 == 运算符来比较 Java 中的 Point 对象吗?
【发布时间】:2011-10-16 17:47:51
【问题描述】:

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

给定二维平面上的两个正方形,找到一条将这两个正方形相切的线 正方形一半。

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

   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 方法中的 '==' 运算符来检查它们是否是同一个正方形的点。点是不可变的吗??请帮助我... 提前致谢。

【问题讨论】:

  • 您在比较对象引用而不是内容本身

标签: java object-comparison object-identity


【解决方案1】:

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

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

当您覆盖 equals() 时,请确保您也相应地覆盖 hashCode()

【讨论】:

【解决方案2】:

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

重要的是你是否关心点对象的身份——它们是否是同一个实例——或者你关心点对象的 .

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

【讨论】:

  • ya..这就是我在想的...middle()方法总是返回一个新的Point对象..不管equals方法是否被覆盖,我们不能使用==来比较对象引用..不是吗??
  • @hareenda:你可以使用==only来比较引用,对于新对象,结果总是false(即使它们对应相同几何点)。
【解决方案3】:

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

将此实例与指定对象进行比较,并指示它们是否 是平等的。为了相等,o 必须代表相同的对象 此实例使用特定于类的比较。一般合同 是这种比较应该是自反的、对称的和 及物的。此外,除了 null 之外,没有任何对象引用等于 null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多