Hi, I got it from Master Exam. 11.x=0; 12.if(x1.hashcode()!=x2.hashcode())x=x+1; 13.if(x3.equals(x4)==false)x=x+10; 14.if(x5.equals(x6)==true)x=x+100; 15.if(x7.hashcode()==x8.hashcod())x=x+1000; 16.System.out.println("x=" + x);

if the output is "x=1111", which of the following will always be true?

Answer given: x2.equals(x1)==true I think this answer violates the contract.the correct answer would be x5.hashcode()==x6.hascode(). other than "x2.equals(x1)" the rest are coming under "can be true" so not suitable for the question asked.

I find that there are really only 2 rules to remmber, i.e. Rule 1 if x1.equals(x2)==true then x1.hashCode()==x2.hashCode() Rule 2 if x1.hashCode()!=x2.hashCode() then x1.equals(x2)==false

because if x1.equals(x2)==false then nothing can be deduced about hashCode() and if x1.hashcode()==x2.hascode() then nothing can be deduced about equals()

Please someone correct me if I have incorrectly oversimplified it.

Using these rules on the problem as given,

line 12, 12. if(x1.hashcode()!=x2.hashcode())x=x+1; easily disproves the answer: x2.equals(x1)==true

and line 14, 14. if(x5.equals(x6)==true)x=x+100; easily proves the answer: x5.hashcode()==x6.hascode()

SCJA 96%
SCJP 6 88%
skipping SCJD to work on passing SCWCD

If x.equals(y)==true then x.hashCode()==y.hashCode() MUST be true; If x.equals(y)==false then x.hashCode()==u.hashCode() MIGHT be true;

And these rules are applied on Collections that uses Hash Codes for fast searching, because they first search the bucket (hashCode) before search the object (equals), otherwise equals() have nothing to do with hashCode().

For instance:

They will be equals even with differente hashCodes, but they will not be found in a collection that uses hash codes for fast searching using its own implemented methods. [ December 05, 2008: Message edited by: Fabio Nascimento ]