问题
I was make some code and found that objects ar eno equals - it is trivial question but not understand how default equals works.
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));
}
}
Result is:
1
1
false
But I want to have a.equals(b) == true
why it is false
?
回答1:
Your class currently extends only Object
class and in Object class equals
method looks like this
public boolean equals(Object obj) {
return (this == obj);
}
What you need is to override this method, for example like this
@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;
}
Also when you override equals
you probably should override hashCode
method, but this is not subject of your question. You can read more about it here.
回答2:
If you don't override equals() on the object, you are comparing two different memory references. So override equals() to compare the id fields.
回答3:
It overrides Object
's equals
method by default, it checks the "same object" rather than "same content". If you want to have a.equals(b) == true
, you should override it:
@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;
}
----- EDITED -----
回答4:
you should rewrite an equals() method for your code, as you would a toString() method.
来源:https://stackoverflow.com/questions/14824113/why-these-two-java-objects-do-not-equals