Reputation: 10138
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
?
Upvotes: 1
Views: 210
Reputation:
you should rewrite an equals() method for your code, as you would a toString() method.
Upvotes: 0
Reputation: 5625
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 -----
Upvotes: 1
Reputation: 124275
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.
Upvotes: 4
Reputation: 53
If you don't override equals() on the object, you are comparing two different memory references. So override equals() to compare the id fields.
Upvotes: 4