为什么这两个Java对象不相等?

为什么这两个Java对象不相等?,java,equals,Java,Equals,我编写了一些代码,发现对象ar eno等于-这是一个很小的问题,但不了解默认等于是如何工作的 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.pri

我编写了一些代码,发现对象ar eno等于-这是一个很小的问题,但不了解默认等于是如何工作的

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

它覆盖
对象的
equals
方法默认情况下,它检查“相同对象”而不是“相同内容”。如果要使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;
}

-----编辑------

默认情况下,它覆盖
对象的
equals
方法,检查“相同对象”而不是“相同内容”。如果要使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;
}

-----编辑------

您的类当前仅扩展
对象
类,而在对象类中
等于方法如下所示

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
方法,但这不是您的问题的主题。您可以阅读更多信息。

您的类当前仅扩展
对象
类,而在对象类中
等于
方法如下所示

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
方法,但这不是您的问题的主题。您可以阅读更多信息。

如果不重写对象上的equals(),您将比较两个不同的内存引用。因此,重写equals()以比较id字段。

如果不重写对象上的equals(),则比较两个不同的内存引用。因此,请重写equals()以比较id字段。

您应该为代码重写equals()方法,就像重写toString()方法一样。

您应该为代码重写equals()方法,就像重写toString()方法一样。

您需要重写
。equals()
您需要重写
。equals()
很好,但代码不清楚(不适合我)-改进代码样式您可能很好,但不可读。由于obj的null+this.is或obj.id.good的null,代码中存在一些错误,但代码样式仍然很难看(也可能更快)-这对你是一个很好的建议。编写大型程序时,最重要的是可读性,而不是代码压缩-这是质量的主要因素。你关注代码压缩(副作用是复杂的,很难理解代码或查看代码),因为它会阻碍开发。例如
!obj.getClass().equals(A.class)
更好的是简单
obj.getClass()!=A.getClass())
(谁知道什么是等于,为什么要检查它,为什么要否定结果)。一些冗余
如果(id==null)返回id==((A)obj).id
=
如果(id==null)返回id==obj.id更好;否则返回false更清晰无需理解转换(如果id==null,那么id==obj.id意味着obj.id==null更快地阅读/查看-尽可能避免逻辑难题。也许我帮不了你什么。很好,但代码不清晰(不适合我)-改进代码样式您可能很好,但不可读。由于obj的null+this.is或obj.id的null,代码中出现了一些错误。代码样式很好,但仍然很难看(可能更快)-这对你是一个很好的建议。编写大型程序时,最重要的是可读性,而不是代码压缩-这是质量的主要因素。你关注代码压缩(副作用是复杂的,很难理解代码或查看代码),因为它会阻碍开发。例如
!obj.getClass().equals(A.class)
更好的是简单
obj.getClass()!=A.getClass())
(谁知道什么是等于,为什么要检查它,为什么要否定结果)。一些冗余
如果(id==null)返回id==((A)obj).id
=
如果(id==null)返回id==obj.id更好;否则返回false更清晰无需理解转换(如果id==null,那么id==obj.id意味着obj.id==null更快阅读/查看-尽可能避免逻辑难题。也许我帮不了你什么。修复了other.id之前失败(null.id->null异常)。修复了other.id之前失败(null.id->null异常).好提示,但@Pschemo有完整的解决方案。好提示,但@Pschemo有完整的解决方案。