• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

hashCode problem

 
Sanjeev Singh
Ranch Hand
Posts: 381
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
From enthuware.

Which of the following statements are correct regarding the above class?
Select 1 correct option.
a) This is an invalid implementation of hashCode() method with respect to the given equals() method.
b) Only one of the Info objects will be stored in the HashMap.
c) Both the objects will be stored in the HashMap.
d) An exception will be thrown at run time at line .

I was expecting c) to be correct,as the keys are meaningfully unequal.But the answer says a) as a correct answer?
s1 will return same hashCode for both the keys.SO that is not invalid.
Can anybody please explain?
 
Ernest Friedman-Hill
author and iconoclast
Marshal
Pie
Posts: 24211
35
Chrome Eclipse IDE Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
If s1, s2 and s3 are "aa", "bb", and "cc" in one object, and "a" "abb", and "cc" in another, this equals() method would return "true", but the hashCode() method would return different values -- and that's a violation of hashCode()'s contract: it must return equal values for any two objects for which equals() returns true.
 
Sanjeev Singh
Ranch Hand
Posts: 381
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thanks Ernest,
I got the point that it is violating the hashcode() and equal() contract.
 
Shiva Mohan
Ranch Hand
Posts: 486
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi,

1. why do we need to substitute different values and do workout since for this class class is particularly specified by the programmer with the values


Info i1 = new Info("aaa", "aaa", "aaa");
Info i2 = new Info("aaa", "bbb", "ccc");


why don't we just substitute the above i1 and i2 values only for equlas() and hashcode() findings and come to the conclusion that "Thia is an valid implementation of hashCode() method with respect to the given equals() method. ?

2. why c option is not correct.Please Help.
 
Anton Uwe
Ranch Hand
Posts: 122
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
As Ernest Friedman-Hill already stated the implementation of "equals(...)" and "hashcode(...)" are not appropriate. So, answer a) is correct.
But of cause answer c) is correct, too.
 
Remko Strating
Ranch Hand
Posts: 893
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Answer C is correct.

If the HashMap was a HashSet then Answer C would be incorrect, because a HashSet cares about uniqueness which is determined by the equals method.
 
Paul Anilprem
Enthuware Software Support
Ranch Hand
Posts: 3753
10
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi Sanjeev,
Can you please quote the questionid of the question? I remember discussing this sometime back and option c was deemed to cause unnecessary diversion from the main point. This was later modified.
 
Shiva Mohan
Ranch Hand
Posts: 486
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thanks for the reply Anton and Wilhelm.
While I apply the values given in the question, I get answer (c) as the correct answer for the question.

I also understand Ernest's explanation as to how we might get answer (a) to be the correct answer for this question, if we apply the values as follows: (s1, s2 and s3 are "aa", "bb", and "cc" in one object, and "a" "abb", and "cc" in another)

What I don't understand is that why do we need to apply different values to this question to arrive at the answer (a) while the question has already given the specific values to apply in the program? If I just applied the values given in the question, I would only get the correct answer as (c).
Please explain.
 
Henry Wong
author
Marshal
Pie
Posts: 21227
81
C++ Chrome Eclipse IDE Firefox Browser Java jQuery Linux VI Editor Windows
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Originally posted by Paul Anil:
Hi Sanjeev,
Can you please quote the questionid of the question? I remember discussing this sometime back and option c was deemed to cause unnecessary diversion from the main point. This was later modified.


Well, it is more than just a diversion. Option C is a valid answer. The statement that "Both the objects will be stored in the HashMap" is true. And having an equals() and hashcode() methods that doesn't fulfill the contract, doesn't change that.

Henry
 
Anton Uwe
Ranch Hand
Posts: 122
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Originally posted by Shiva Mohan:
What I don't understand is that why do we need to apply different values to this question to arrive at the answer (a) while the question has already given the specific values to apply in the program? If I just applied the values given in the question, I would only get the correct answer as (c).
Please explain.

Well, if the implementation of hashcode() and equals() is fulfilling the contract or is not fulfilling the contract has nothing to do with special objects of the class. The contract must be fulfilled for "ALL" possible objects of the class.
So it is ok to search for 2 possible objects of the class where the contract is NOT fulfilled to prove that the implementation is NOT correct.
 
Shiva Mohan
Ranch Hand
Posts: 486
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Good points Anton and Henry. Thanks.

so for this problem the following any one of the option is valid.
a This is an invalid implementation of hashCode() method with respect to the given equals() method.
b.if there is an option telling this is an invalid implementation of the equlas() method.

both are correct.Is my understanding correct?

Hi Paul,
The question Id of this question is 1043963785218. Please verify and answer here.

[ February 11, 2007: Message edited by: Shiva Mohan ]

[ February 11, 2007: Message edited by: Shiva Mohan ]
[ February 11, 2007: Message edited by: Shiva Mohan ]
 
Paul Anilprem
Enthuware Software Support
Ranch Hand
Posts: 3753
10
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
This question was in the old question bank and was updated in the new (current) version with a new question id ( com.enthuware.ets.scjp.v5.2.711 ). Option c was changed to:

Both the objects will be stored in the HashMap however retrieving them using the Info objects as keys will not be possible.


This is marked incorrect with the following explanation for this option:

In this particular case, since the keys (i.e. the two Info objects) are unequal as per their equals() method, and their hashCodes are also different, the HashMap will work properly. Both the objects will be stored and retrieved. However, it will fail when Info objects that break the rule of equals() and hashCode() are put in the map.


HTH,
Paul.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic