I understand the difference between == and .equals. There are plenty of other questions on here that explain the difference in detail e.g. this one: What is the difference between .Equals and == this one: Bitwise equality amongst many others.
My question is: why have them both (I realise there must be a very good reason) - they both appear to do the same thing (unless overridden differently).
When would == be overloaded in a different way to how .equals is overridden?
In order to identity differences between two objects we need to override equals method.
In simple words, == checks if both objects point to the same memory location whereas . equals() evaluates to the comparison of values in the objects. If a class does not override the equals method, then by default, it uses the equals(Object o) method of the closest parent class that has overridden this method.
Terminology note: == is never overridden. It's overloaded.
Why we override equals() method? It needs to be overridden if we want to check the objects based on the property. For example, we want to check the equality of employee object by the id. Then, we need to override the equals() method.
==
is bound statically, at compile-time, because operators are always static. You overload operators - you can't override them. Equals(object)
is executed polymorphically, because it's overridden.
In terms of when you'd want them to be different...
Often reference types will override Equals
but not overload ==
at all. It can be useful to easily tell the difference between "these two references refer to the same object" and "these two references refer to equal objects". (You can use ReferenceEquals
if necessary, of course - and as Eric points out in comments, that's clearer.) You want to be really clear about when you do that, mind you.
double
has this behavior for NaN values; ==(double, double)
will always return false when either operand is NaN
, even if they're the same NaN. Equals
can't do that without invalidating its contract. (Admittedly GetHashCode
is broken for different NaN
values, but that's a different matter...)
I can't remember ever implementing them to give different results, personally.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With