java - contrario - Comparando primitivo a objeto de envoltura con comportamiento== inexplicable
use equals java (4)
Tengo un código que necesito entender:
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);
}
Salida:
true
true
false
No puedo entender por qué solo la tercera declaración está fallando.
EDITAR: Esta pregunta es diferente a la pregunta .equals
vs ==
, ya que se trata de la comparación de primitivo versus objeto.
es obvio por qué la última comparación da false
: ambos Character
se inicializan explícitamente con new
, por lo que son objetos diferentes
sin embargo, la razón por la que las dos primeras comparaciones son true
es en parte clara: el valor char
se usa definitivamente para recuperar una instancia de Character
pre-almacenada, pero no sé cómo se asignan exactamente los objetos de Character
predefinidos a esta pre-definición Character
instancia almacenada
Sin embargo, es de esperar que funcione como "==": comparación para los objetos String
: si en el momento de la compilación una de las instancias comparadas es un carácter previamente almacenado, el compilador inserta una llamada a equals()
reemplazando el "==" -comparación
c
y cy
refieren a diferentes instancias de la clase de Character
(cada vez que invocas a un constructor, creas una nueva instancia), por lo que comparar estas referencias devuelve false
.
Por otro lado, cuando comparas cualquiera de ellos con el cx
primitivo, no están encajonados con el char
, y la comparación del char
devuelve verdadero.
Si hubiera usado Character.valueOf(''a'')
lugar de un new Character(''a'')
, habría obtenido la misma instancia en ambas llamadas, y la comparación de referencia habría devuelto true
(ya que valueOf
devuelve una instancia de Character
almacenada en caché si el argumento <= 127).
System.out.println(c == cx);
System.out.println(cx == cy);
Dado que uno es primitivo y otro es una clase envolvente de él, el desempaquetado ocurre y la comparación primitiva tiene lugar (==).
Mientras:
System.out.println(c == cy);
Es una comparación de objetos. Se están comparando diferentes instancias, por lo que ==
no funcionará en este caso.