2

Tengo una pequeña duda, tengo el siguiente código

public static void main(String[] main) {
    String s1 = "Java";
    String s2 = "Java";

    StringBuilder sb1 = new StringBuilder();
    sb1.append("Ja").append("va");

    System.out.println(s1 == s2);

    System.out.println(s1.equals(s2));

    System.out.println(sb1.toString() == s1);

    System.out.println(sb1.toString().equals(s1));

}

La salida es:

true
true
false
true

Mi duda es es esta línea:

System.out.println(sb1.toString() == s1);

¿Por qué esto no es igual? ¿Por qué no es true?

Riaven
  • 3,379
  • 5
  • 14
  • 31
Alvarez
  • 3,957
  • 2
  • 15
  • 36
  • Te dejo este enlace que te servirá de mucha ayuda: https://www.campusmvp.es/recursos/post/java-comparacion-de-cadenas-literales-clases-repositorio-de-cadenas.aspx – DevMind Feb 25 '20 at 22:05
  • Posible duplicado: https://es.stackoverflow.com/questions/225/c%C3%B3mo-comparar-correctamente-strings-y-objetos-en-java – MrDave1999 Feb 25 '20 at 22:45

1 Answers1

4

La siguiente línea :

System.out.println(sb1.toString() == s1);

Se está usando mal ==, ya que al querer comparar dos objetos String, con ==, no estás comparando su contenido, si no que estás comparando que ambas cadenas sean el mismo objeto.

Lo correcto es comparar con el método equals() o equalsIgnoreCase()


Ahora bien, la siguiente línea:

 System.out.println(s1 == s2);//funciona y devuelve lo esperado

Funciona correctamente, ya que el compilador de Java, al crear s2, ve que ya existe un objeto con el mismo valor, en este caso s1, y lo usa, por lo mismo en ese caso daría true, ya que hacen referencia al mismo objeto.

A diferencia de la línea que te da false, ya que al aplicar el método toString() a s1, se está creando una nueva instancia diferente a las anteriores.

Información extraída de COMO COMPARAR STRING EN JAVA

Riaven
  • 3,379
  • 5
  • 14
  • 31