I wanted to clarify if I understand this correctly:
==
-> is a reference comparison, i.e. both objects point to the same memory location.equals()
-> evaluates to the comparison of values in the objects
Am I correct in my understanding ?
I wanted to clarify if I understand this correctly:
==
-> is a reference comparison, i.e. both objects point to the same memory location.equals()
-> evaluates to the comparison of values in the objectsAm I correct in my understanding ?
Here is a general thumb of rule for the difference between
relational operator ==
andthe method .equals()
.object1 == object2
compares if the objects referenced by object1 and object2 refer to the same memory location in Heap.object1.equals(object2)
compares the values of object1 and object2 regardless of where they are located in memory.This can be demonstrated well using String
Scenario 1
Scenario 2
This string comparison could be used as a basis for comparing other types of object.
For instance if I have a Person class, I need to define the criteria base on which I will compare two persons. Let's say this person class has instance variables of height and weight.
So creating person objects
person1 and person2
and for comparing these two using the.equals()
I need to override the equals method of the person class to define based on which instance variables(heigh or weight) the comparison will be.However, the
== operator will still return results based on the memory location of the two objects(person1 and person2)
.For ease of generalizing this person object comparison, I have created the following test class. Experimenting on these concepts will reveal tons of facts.
Result of this class execution is:
Cheers :-)
The difference between == and equals confused me for sometime until I decided to have a closer look at it. Many of them say that for comparing string you should use
equals
and not==
. Hope in this answer I will be able to say the difference.The best way to answer this question will be by asking a few questions to yourself. so let's start:
What is the output for the below program:
if you say,
I will say you are right but why did you say that? and If you say the output is,
I will say you are wrong but I will still ask you, why you think that is right?
Ok, Let's try to answer this one:
What is the output for the below program:
Now If you say,
I will say you are wrong but why is it wrong now? the correct output for this program is
Please compare the above program and try to think about it.
Ok. Now this might help (please read this : print the address of object - not possible but still we can use it.)
can you just try to think about the output of the last three lines in the code above: for me ideone printed this out (you can check the code here):
Oh! Now you see the identityHashCode(mango) is equal to identityHashCode(mango2) But it is not equal to identityHashCode(mango3)
Even though all the string variables - mango, mango2 and mango3 - have the same value, which is "mango",
identityHashCode()
is still not the same for all.Now try to uncomment this line
// mango2 = "mang";
and run it again this time you will see all threeidentityHashCode()
are different. Hmm that is a helpful hintwe know that if
hashcode(x)=N
andhashcode(y)=N
=>x is equal to y
I am not sure how java works internally but I assume this is what happened when I said:
java created a string
"mango"
which was pointed(referenced) by the variablemango
something like thisNow in the next line when I said:
It actually reused the same string
"mango"
which looks something like thisBoth mango and mango2 pointing to the same reference Now when I said
It actually created a completely new reference(string) for "mango". which looks something like this,
and that's why when I put out the values for
mango == mango2
, it put outtrue
. and when I put out the value formango3 == mango2
, it put outfalse
(even when the values were the same).and when you uncommented the line
// mango2 = "mang";
It actually created a string "mang" which turned our graph like this:This is why the identityHashCode is not the same for all.
Hope this helps you guys. Actually, I wanted to generate a test case where == fails and equals() pass. Please feel free to comment and let me know If I am wrong.
It may be worth adding that for wrapper objects for primitive types - i.e. Int, Long, Double - == will return true if the two values are equal.
To contrast, putting the above two Longs into two separate ArrayLists, equals sees them as the same, but == doesn't.
Since Java doesn’t support operator overloading, == behaves identical for every object but equals() is method, which can be overridden in Java and logic to compare objects can be changed based upon business rules.
Main difference between == and equals in Java is that "==" is used to compare primitives while equals() method is recommended to check equality of objects.
String comparison is a common scenario of using both == and equals method. Since java.lang.String class override equals method, It return true if two String object contains same content but == will only return true if two references are pointing to same object.
Here is an example of comparing two Strings in Java for equality using == and equals() method which will clear some doubts:
You will have to override the equals function (along with others) to use this with custom classes.
The equals method compares the objects.
The
==
binary operator compares memory addresses.