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.