aspose file tools*
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Inquisition qustion regarding equals() and hashCode() Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Spring in Action this week in the Spring forum!
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Inquisition qustion regarding equals() and hashCode()" Watch "Inquisition qustion regarding equals() and hashCode()" New topic
Author

Inquisition qustion regarding equals() and hashCode()

Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Given two objects a and b of the same class, and if equals() and hashCode() are implemented correctly for that class, which of the following must hold true?

opt1: If a.hashCode() != b.hashCode() then !a.equals(b) #i agree its true!
opt2: If a.hashCode() == b.hashCode() then a.equals(b) # why its not true


SCJP6 96% | SCWCD5 81% | SCDJWS5 79%
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
if the hashcodes are same its not neccasary that both the objects are equals..they maybe be equals they may not be depending the way you have declared your equals method


scjp 1.6 91%, preparing for scmad
"Time to get MAD now.. we will get even later"....by someone unknown
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Raju Champaklal wrote:if the hashcodes are same its not neccasary that both the objects are equals..they maybe be equals they may not be depending the way you have declared your equals method


was opt1 is not just opposite of the opt2?
I mean if
(a.hashCode() != b.hashCode()) == (!a.equals(b)) is true then
(a.hashCode() == b.hashCode()) == (a.equals(b)) why this is not true as well??
Marzio Let
Greenhorn

Joined: Dec 11, 2009
Posts: 1
No. Maybe if you write it on paper, with the usual logical symbol... it's an "if then" implication not an "if and only if": a equals b => a's hash code is equal to b's hash code. (TRUE) This can be written also: a's hash code not equal to b's hash code => a is not equal to b (TRUE).
But you can't deduce the opposite implication: a's H.C. == b's H.C. => a equals b (FALSE) This (false) statement can be written also as: a not equal b => a's H.C. != b's H.C. Maybe written this way it's easier to see because it's false (mind, I mean the implication is false; it may be true in some cases, but you can't be sure).
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400



Note: The hashcode() and equals() generated through eclipse ide!
rohan yadav
Ranch Hand

Joined: Oct 13, 2009
Posts: 156
Hi Minhaj,
First remember that if two objects hascode() method is equal, it doesn't necessarily mean that the two objects are equal.

Here a.hashCode()==b.hashCode() means you have a and b two objects are in same bucket not they are equal.


Sage of The Monstrous Toad of Mount Myoboku
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

rohan yadav wrote:Hi Minhaj,
First remember that if two objects hascode() method is equal, it doesn't necessarily mean that the two objects are equal.

Here a.hashCode()==b.hashCode() means you have a and b two objects are in same bucket not they are equal.


Hi Rohan,

well if two objects hashCode() methos is equal - means the content of both object are EQUAL!

and what is the purpose of equals() method? that the content should be same! right?

if(a.equals(b) == true then its not mandatory
a == b
means the content could be same but object's memory reference could be different!!
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
suppose you add new Integer(4); to a set two times.....obviuosly a set returns false when you try to put in a duplicate....now when you put the 2nd Integer(4) inside the set first the Set calls the hashcode on every object already present in the set....if the hashcode of the object you want to put and hashcode of any object already there in the set matches then equals method of those 2 objects having similar hashcodes are called....if the equals() returns true on both those objects than the both the objects are considered equals and the set does not add the duplicate to the set by returning false



now since in Integer class the hashcode and equals method are overloaded the Set understands what a duplicate and you dont have to override them in your class

but if you have made a class by yourself and if you dont put hashcodes method but only equals method than no object will be considered equal because first hashcode() is called which returns a unique number everytime...so if you want to put objects in a collection ad you want to prevent duplicates getting inside override both the hashcode and the equals method...overriding just one wont prevent the duplication occur.....but if your not using collections you can make your own equals method according to your programs need

understood???
rohan yadav
Ranch Hand

Joined: Oct 13, 2009
Posts: 156
Minhaj kaimkhani wrote:
rohan yadav wrote:Hi Minhaj,
First remember that if two objects hascode() method is equal, it doesn't necessarily mean that the two objects are equal.

Here a.hashCode()==b.hashCode() means you have a and b two objects are in same bucket not they are equal.


Hi Rohan,

well if two objects hashCode() methos is equal - means the content of both object are EQUAL!

and what is the purpose of equals() method? that the content should be same! right?

if(a.equals(b) == true then its not mandatory
a == b
means the content could be same but object's memory reference could be different!!


Note that two objects hashcode() methods is equals - means they point to same bucket by some hashing criteria defined in hashCode() mehod
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
if you are making your own class and you yourself want to check if two objects are equals you dont want to implement hashcodes...just equals will do it...becasue when you call equals method in your class no hashcodes is called...but in a collection hashcodes is always called
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

can anyone show me such code where:

a.hashCode() == b.hashCode() comes true
then
a.equals(b) does not come true.

because in my code(see above)
a.equals(b) is always true when a's and b's hash codes are same!


Minhaj
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521


this is wrong my friend....

and a.equals(b) if true doesnt mean the content of both the objects is same....if you are talking about string class or integer class or java classes then the content is same but if you are talking about classes made by the user then equals method is dependent on hoe you have defined the equals method in your class
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Given two objects a and b of the same class, and if equals() and hashCode() are implemented correctly for that class, which of the following must hold true?



check the question! equals() and hashCode() must be implemented true!
rohan yadav
Ranch Hand

Joined: Oct 13, 2009
Posts: 156

Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Rohan your code is fine!

but is this the correct implementation of equals() and hashCode(), I mean its totally legal, but examiner said where "hashCode() & equals() implemented correct"l!!
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
what do you think the examiner mean exactly...maybe we can discuss the possibilities
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Raju Champaklal wrote:what do you think the examiner mean exactly...maybe we can discuss the possibilities


I thought correctly means the way i implemented!!
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
how can this be the right implementation of equals method when you are not using it in the right way and returingn true everytime....you arent even comparing the variables of different objects...you are not comparing anything....how can you call it right implementation?

Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Raju Champaklal wrote:how can this be the right implementation of equals method when you are not using it in the right way and returingn true everytime....you arent even comparing the variables of different objects...you are not comparing anything....how can you call it right implementation?




Isn't it right? Can you explain a bit more?
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
dude i am sorry i lose....you won...congrats....i cant take it anymore..any questions of hashocde and equals cming in exam would be left by me
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

Raju Champaklal wrote:dude i am sorry i lose....you won...congrats....i cant take it anymore..any questions of hashocde and equals cming in exam would be left by me


Oh come on dude!! the discussion is not about win or lose!! i was just trying to clear my doubts nothing else!!
Raju Champaklal
Ranch Hand

Joined: Dec 10, 2009
Posts: 521
this is from whizlabs....hope this will clear you...how shoudl i upload the image?
Neha Daga
Ranch Hand

Joined: Oct 30, 2009
Posts: 504
lets see Rohan's code:

his hashcode method says: two animals having same name length will return equal hashcode i.e if animal1 has name 'juno' and animal2 has name 'luno' then the hashcode will be equal.

his equal method syas: two animal objects will be equal only if they have same name.now animal1 and animal2 dont have same name so they can't be equal.

in this case it is clear that animal1 and animal2 are not equal inspite of having equal hashcodes.

remember as rohan says:

Two objects having same hashcodes are in same bucket that doesn't mean they are equal.

their being equal depends only on how class' equal method is implemented.


SCJP 1.6 96%
Minhaj Mehmood
Ranch Hand

Joined: Jan 22, 2007
Posts: 400

another question raised into my mind:
the methods equals() and hashCode() in my 5th code are implemented correctly enough efficient as stated into K&B chap 7??


Minhaj
 
 
subject: Inquisition qustion regarding equals() and hashCode()