【问题标题】:When do we say Object1 .equals(Object2) is true?我们什么时候说 Object1 .equals(Object2) 是真的?
【发布时间】:2014-12-11 07:22:20
【问题描述】:

我写了以下代码:

public class Test{
    int a;
    public static void main(String[] args){
        Test t1 = new Test();
        Test t2 = new Test();
        if(!t1.equals(t2))
            System.out.println("They're not equal");
        if(t1 instanceof Test)
            System.out.println("True");
    }
}

这是输出

They're not equal
True

我什至尝试为这两个对象的实例变量'a' 分配相同的值,如下所示,

t1.a = 10;
t2.a = 10;

还是一样的输出。

我可以知道t1.equals(t2) 何时返回Trueequals() 方法如何作用于对象?

【问题讨论】:

  • 覆盖Object类默认提供的equals方法
  • 你需要重写equal()hashCode()(可选)方法来实现这个
  • 我想你误解了实例方法,请尝试阅读Java中的对象平等,它会消除你所有的疑惑
  • 我的 2 美分:如果你这样做 Test t1 = new Test(); Test t2 = t1;,那么 t1.equals(t2) 将返回 true。

标签: java object equals


【解决方案1】:

默认情况下,调用equals 会执行Object 类的equals 方法,该方法仅在您将实例与其自身进行比较时返回true。

您可以在其他类中重写此方法,以便equals 在两个对象的属性相等时返回 true。

例如:

@Override
public boolean equals(Object other)
{
    if (other == null)
        return false;
    if (other instance of Test) {
        Test t = (test) other;
        return this.a == t.a;
    }
    return false;
}

将此方法添加到您的Test 类会将t1.equals(t2) 的结果更改为true

【讨论】:

  • 哦,现在知道了。我认为 equals() 会检查 2 个不同的对象是否相同。
  • @TouhidK。可以,但是您必须为您的特定班级定义相同的含义。
【解决方案2】:

Object.equals(Object)Javadoc 说(部分),

指示其他对象是否“等于”这个对象。

equals 方法在非空对象引用上实现等价关系:

  • 它是自反的:对于任何非空引用值 x,x.equals(x) 应该返回 true。
  • 它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。
  • 它是可传递的:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,则 x.equals(z) 应该返回 true .
  • 这是一致的:对于任何非空引用值 x 和 y,x.equals(y) 的多次调用始终返回 true 或始终返回 false,前提是没有修改对象上 equals 比较中使用的信息。李>
  • 对于任何非空引用值 x,x.equals(null) 应返回 false。

对于您的代码,您可以覆盖 equals 之类的

@Override
public boolean equals(Object o) {
    if (o instanceof Test) {
        return ((Test) o).a == a;
    }
    return false;
}

【讨论】:

    【解决方案3】:

    Object.equals 的默认实现仅当两个对象完全相同时才将它们视为相等,不仅内容相同,而且引用相同。

    对象可以有不同的equals实现,但你必须明确地对它们进行编程:如果你想检查所有字段是否相等,你必须实际编写一个检查它的equals实现。

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 2014-11-13
      • 1970-01-01
      • 2015-01-26
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多