equal contrario java equals equality boxing

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


Charcter clase Charcter no es singleton, por lo que siempre se creará un nuevo objeto al llamar al contructor y los nuevos objetos se referirán a sus respectivas referencias. Así que (c == cy) le da falso


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.