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.
c
and cy
refer to different instances of the Character
class (each time you invoke a constructor, you create a new instance), so comparing these references returns false
.
On the other hand, when you compare either of them to the primitive cx
, they are unboxed to char
, and the char
comparison returns true.
Had you used Character.valueOf('a')
instead of new Character('a')
, you would have gotten the same instance in both calls, and the reference comparison would have returned true
(since valueOf
returns a cached Character
instance if the argument <= 127).
System.out.println(c == cx);
System.out.println(cx == cy);
Since one is primitive and another is a wrapper class of it, unboxing happens and primitive comparison takes place (==).
Whereas:
System.out.println(c == cy);
is an Object comparison. Different instances are getting compared so ==
won't work in this case.
Charcter class is not singleton, so always a new object will be creating when calling the contructor and new objects refer to their respective references.So
(c == cy)
gives you false
it's obvious why the last comparision gives false
: both Character
s are explicitly initialized with new
, thus being different objects
why the first two comparisions give true
, however, is only partly clear: the char
value is definitely used to retrieve a pre-stored Character
instance, but I don't know how exactly the pre-defined Character
objects are mapped to this pre-stored instance
I would expect, though, it works like "=="-comparision for String
objects: if at compile time one of the compared instances is a pre-stored Character
then the compiler inserts a call to equals()
replacing the "=="-comparision
来源:https://stackoverflow.com/questions/36544223/comparing-primitive-to-wrapper-object-with-behaviour-unexplained