为什么这两个Java对象不相等?
我编写了一些代码,发现对象ar eno等于-这是一个很小的问题,但不了解默认等于是如何工作的为什么这两个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
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如果(id==null&&obj.id==null)返回true,则code>更好;否则返回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如果(id==null&&obj.id==null)返回true,则code>更好;否则返回false代码>更清晰无需理解转换(如果id==null,那么id==obj.id意味着obj.id==null更快阅读/查看-尽可能避免逻辑难题。也许我帮不了你什么。修复了other.id之前失败(null.id->null异常)。修复了other.id之前失败(null.id->null异常).好提示,但@Pschemo有完整的解决方案。好提示,但@Pschemo有完整的解决方案。