Chameleon
Chameleon

Reputation: 10138

Why these two Java objects do not equals?

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

Answers (4)

user2782485
user2782485

Reputation:

you should rewrite an equals() method for your code, as you would a toString() method.

Upvotes: 0

shuangwhywhy
shuangwhywhy

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

Pshemo
Pshemo

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

pwfixed
pwfixed

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

Related Questions