Java - Diferencia entre == y equals

 
Vista:

Diferencia entre == y equals

Publicado por Ricardo (1 intervención) el 13/02/2019 05:57:32
Hola a todos,
Tengo una pequeña duda acerca de la diferencia entre el operador == y equals pues he investigado y entiendo que el == compara referencias mientras que el equals compara valores. Sin embargo no entiendo porque a veces el == funciona con objetos de tipo String.
Por ejemplo algo como:

1
2
3
String texto1 = "texto";
String texto2 = "texto";
System.out.print(texto1 == texto2);

Imprime verdadero.

Pero si programo algo como:

1
2
3
4
Scanner sc = new Scanner(System.in);
String texto1 = "texto";
String texto2 = sc.next();
System.out.println(texto1 == texto2);

Y luego escribo en la linea de comando "texto", ahora imprime falso.

Lo que no entiendo es ¿por qué en el primer caso ambas cadenas hacen referencia al mismo objeto y en el segundo caso ya no?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Diferencia entre == y equals

Publicado por Kabuto (1381 intervenciones) el 14/02/2019 00:50:56
La primera vez que haces:
1
String texto1 = "texto";
"texto" ya genera un objeto de por sí, con su propia referencia. Y lo que hace esa linea es que la referencia texto1 apunte también a esa referencia.
Cuando luego hacemos:
1
String texto2 = "texto";
El compilador ya sabe que hay otra cadena "texto" igual, así que no genera un nuevo objeto. Lo considera el mismo que se ha creado antes y ahora lo que hace es pasarle esa referencia a texto2

Así que ahora mismo, texto1, texto2 y "texto" apuntan al mismo objeto. Por eso el operador == te dirá que son iguales


No lo he probado, pero seguramente si haces esto:
1
2
String texto1 = new String("texto");
String texto2 = new String("texto");

Ahora sí que el operador == te dirá que son referencias distintas, porque con la orden new forzamos a crear un nuevo objeto, con su propia referencia cada uno.
Y equals() te dirá que son lo mismo, porque el valor si es igual.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre == y equals

Publicado por Tom (1831 intervenciones) el 14/02/2019 09:21:10
No liemos la madeja, el compilador se limita a generar bytecodes, no genera referencias.

Básicamente, lo que hace es sustituir esto:

String texto1 = "texto";
String texto2 = "texto";

por esto otro:

String texto1 = "texto".intern();
String texto2 = "texto".intern();

Lo que sí puede hacer el compilador (nada asegura que así sea) es reducir a uno los literales iguales en una misma clase, dentro del .class generado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar