I have a piece of code which I need to understand:
public static void main(String[] args) {
Character c = new Character('a');
Character cy = new Character('a');
char cx = 'a';
System.out.println(c == cx);
System.out.println(cx == cy);
System.out.println(c == cy);
}
Output:
true
true
false
I am unable to understand why only the third statement is failing.
EDIT: This question is different to the .equals
vs ==
question as this about primitive versus object comparison.
Best Answer
c
andcy
refer to different instances of theCharacter
class (each time you invoke a constructor, you create a new instance), so comparing these references returnsfalse
.On the other hand, when you compare either of them to the primitive
cx
, they are unboxed tochar
, and thechar
comparison returns true.Had you used
Character.valueOf('a')
instead ofnew Character('a')
, you would have gotten the same instance in both calls, and the reference comparison would have returnedtrue
(sincevalueOf
returns a cachedCharacter
instance if the argument <= 127).