La diferencia entre == e igual me confundió durante algún tiempo hasta que decidí echarle un vistazo más de cerca. Muchos de ellos dicen que para comparar cadenas debe usar equals
y no ==
. Espero que en esta respuesta pueda decir la diferencia.
La mejor manera de responder a esta pregunta será haciéndose algunas preguntas. así que empecemos:
¿Cuál es la salida para el siguiente programa:
String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);
si usted dice,
false
true
Diré que tienes razón, pero ¿por qué dijiste eso ? y si dices que la salida es,
true
false
Diré que estás equivocado pero aún te preguntaré, ¿por qué crees que eso es correcto?
Ok, intentemos responder a esta:
¿Cuál es la salida para el siguiente programa:
String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);
Ahora si dices,
false
true
Diré que estás equivocado, pero ¿por qué está mal ahora ? la salida correcta para este programa es
true
false
Compare el programa anterior y trate de pensarlo.
Okay. Ahora esto podría ayudar (lea esto: imprima la dirección del objeto ; no es posible, pero aún así podemos usarlo).
String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));
¿Puedes tratar de pensar en la salida de las últimas tres líneas en el código anterior? Para mí, ideone imprimió esto ( puedes consultar el código aquí ):
false
true
true
false
mango mango
false
true
17225372
17225372
5433634
Oh! Ahora ve que identityHashCode (mango) es igual a identityHashCode (mango2) Pero no es igual a identityHashCode (mango3)
A pesar de que todas las variables de cadena - mango, mango2 y mango3 - tienen el mismo valor, que es "mango", identityHashCode()
todavía no es el mismo para todos.
Ahora intenta descomentar esta línea // mango2 = "mang";
y ejecútala de nuevo esta vez, verás que las tres identityHashCode()
son diferentes. Hmm eso es una pista útil
sabemos que si hashcode(x)=N
y hashcode(y)=N
=>x is equal to y
No estoy seguro de cómo funciona Java internamente, pero supongo que esto es lo que sucedió cuando dije:
mango = "mango";
Java creó una cadena "mango"
que fue señalada (referenciada) por la variable mango
algo como esto
mango ----> "mango"
Ahora en la siguiente línea cuando dije:
mango2 = "mango";
En realidad reutilizó la misma cadena "mango"
que se parece a esto
mango ----> "mango" <---- mango2
Tanto mango como mango2 apuntan a la misma referencia Ahora cuando dije
mango3 = new String("mango")
En realidad, creó una referencia (cadena) completamente nueva para "mango". que se parece a esto,
mango -----> "mango" <------ mango2
mango3 ------> "mango"
y es por eso que cuando pongo los valores para mango == mango2
, saca true
. y cuando puse el valor para mango3 == mango2
, puse false
(incluso cuando los valores eran los mismos).
y cuando descomentaste la línea // mango2 = "mang";
, en realidad creó una cadena "mang" que convirtió nuestro gráfico de esta manera:
mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"
Es por eso que identityHashCode no es el mismo para todos.
Espero que esto les ayude chicos. En realidad, quería generar un caso de prueba donde == falla y pasa igual (). Por favor, siéntase libre de comentar y avíseme si estoy equivocado.