1

我编写了一些代码,发现对象 ar eno equals - 这是一个微不足道的问题,但不明白默认 equals 是如何工作的。

class A {
    String id;
    public A(String id) {
        this.id = id;
    }

    public static void main(String args[])
    {
        A a = new A("1");
        A b = new A("1");
        System.out.println(a.id);
        System.out.println(b.id);
        System.out.println(a.equals(b));
    }
}

结果是:

1
1
false

但我想知道a.equals(b) == true为什么会这样false

4

4 回答 4

4

您的类目前仅扩展Object类,并且在 Object 类equals方法中看起来像这样

public boolean equals(Object obj) {
    return (this == obj);
}

您需要的是覆盖此方法,例如像这样

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    A other = (A) obj;
    if (id == other.id)
        return true;
    if (id == null)
        return false;
    if (other.id == null)
        return false;
    if (!this.id.equals(other.id))
        return false;
    return true;
}

此外,当您覆盖时,equals您可能应该覆盖hashCode方法,但这不是您问题的主题。你可以在这里阅读更多关于它的信息。

于 2013-02-12T01:46:34.407 回答
4

如果您不覆盖对象上的 equals(),则您正在比较两个不同的内存引用。所以重写 equals() 来比较 id 字段。

于 2013-02-12T01:50:09.147 回答
1

它默认覆盖Object'sequals方法,它检查“相同的对象”而不是“相同的内容”。如果你想拥有a.equals(b) == true,你应该覆盖它:

@Override
public boolean equals (Object obj) {
    if (obj instanceof A) {
        A a = (A) obj;
        if (id == null) {
            return a.id == null;
        } else {
            return id.equals(a.id);
        }
    }
    return false;
}

----- 已编辑 -----

于 2013-02-12T01:46:31.300 回答
0

你应该为你的代码重写一个 equals() 方法,就像你需要一个 toString() 方法一样。

于 2013-12-22T22:03:54.043 回答