1

Si creo dos Strings con el mismo contenido y los comparo con "==" da true. Sin embargo si construyo dos objetos con concatenando " " (comillas) con los valores de un arreglo da false. La salida del programa abajo da false, false , true. Pregunta: porqué dos String con mismo contenido dan true si se comparan con == y dos String construidos con " "(comillas) concatenados con valores idénticos de dos arrays dan false si se comparan con ==. Por motivos didácticos no quiero compararlos con equals, o compareTo o cualquier otro método de comparación.

package utiles;

public class Test1 {


static int dim=5;
public static void main(String[] args) {
    // TODO Auto-generated method stub

    String a="dos";
    String b="dos";
    int[]m1= {2, 3, 4, 6};
    int[]m2= {2, 3, 4, 6};



System.out.print((m1==m2)+ " dos arrays con mismo contenido da false  si se comparan con '=='\n");
System.out.println(Test1.esArrayIgual(m1, m2)+" dos String construidos a partir de array con mismo contenido"
        + " da false si se comparan con '=='\n");
System.out.println((a==b) +" dos String con mismo contenido da true si se comparan con ==");    


}   


public static boolean esArrayIgual(int[] obj1, int[] obj2) {



    String str1="";
    String str2="";

    for(int i=0; i<obj1.length; i++) {
        str1+=obj1[i];}


    for(int i=0; i<obj2.length; i++) {
        str2+=obj2[i];}


        if(str2==str1) return true;
        //System.out.println(str1.compareTo(str2));

        return false;


        }

    }
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
Javi
  • 445
  • 2
  • 10
  • Por motivos didácticos te aconsejo compararlos con `equals` – Pablo Lozano May 17 '20 at 12:41
  • Tu ejemplo es la demostración de que comparando Strings creados de distintas formas dan resultados de comparación diferentes si se utiliza el comparador ==. Por eso construyeron el método equals, y por eso las cadenas Strings se comparan con equals. Pasa de buscarle 3 pies al gato, y tener que escribir en tus programas líneas de más por no querer usar equals. Me da que no vas a encontrar ningún caso real en tu vida de programador que no puedas usar el método equals para comparar 2 cadenas de texto. – Jesús May 17 '20 at 12:50
  • En realidad, lo que pretendo es buscarle 3 pies al gato. Lo que me interesa no es usar equals, sino saber porque un string a veces se puede comparar con == y otras no, como demuestra el sencillo ejemplo – Javi May 17 '20 at 14:29
  • @Jesús Depende. Si en la vida real usas un lenguaje en la cual permita la sobrecarga de operadores, podrías lograr que el operador == pueda comparar cadenas. Ejemplos: C++ y C# – MrDave1999 May 17 '20 at 14:31
  • https://es.stackoverflow.com/questions/225/cómo-comparar-correctamente-strings-y-objetos-en-java?noredirect=1&lq=1 Esto si responde a la pregunta y no lo había visto hasta ahora – Javi May 17 '20 at 14:39
  • Arriba, los literales se comparan por valor y por eso da true y abajo se comparan por referencia, alojados en ubicaciones de memoria diferentes y por eso da false. El enlace lo explica bien – Javi May 17 '20 at 14:47
  • 1
    @Javi El primer da false, porque las referencias (aunque en realidad son punteros internamente) m1 y m2 apuntan a una región de memoria (eso es un objeto en si) diferente. El segundo da false también, porque el método lo único que hace es concantenar cada elemento del array y al final, los punteros str1 y str2 terminan apuntando a objetos diferentes, ya que por cada concatenación se crea un nuevo objeto. – MrDave1999 May 17 '20 at 17:06
  • 1
    @Javi El tercero da true por el tema del StringPool, como son cadenas constantes, no se requiere crear dos objetos que tengan la misma cadena, sino, únicamente uno. Así que tanto a y b apuntarán a lo mismo. Esto es una especie de optimización que pueda hacer la máquina virtual de Java. Aunque solo servirá si no creas la instancia con el operador new. – MrDave1999 May 17 '20 at 17:07
  • 1
    @MrDave1999 gracias. Entendí finalmente porqué. Hice algunos test más y de paso aprendí la diferencia entre paso por valor y por referencia que era algo que no me había quedado claro. He supuesto además que el método equals descompondrá los Strings para comparar los valores primitivos. De hecho, en el ejercicio que me ha provocado todas estas dudas hice un método que descompone los miembros de un objeto en primitivos para testear si de verdad son iguales. Me alegro de no haber tomado el método equals sin más para comparar Strings y haber indagado para aprender porqué ocurre la diferencia – Javi May 17 '20 at 17:22
  • @Javi Ojo: En Java no existe el **paso por referencia**, todo se pasa por valor. Aunque se suele usar el término pasar el **objeto por referencia**. – MrDave1999 May 17 '20 at 17:25
  • @MrDave1999 a eso último me refiero. Aunque cuando se dice que todo pasa por valor no se si se referirá a que finalmente todo lo que se comprueba son dígitos...tengo poca experiencia – Javi May 17 '20 at 17:53
  • [Continuemos el debate en el chat](https://chat.stackexchange.com/rooms/108145/discussion-between-mrdave1999-and-javi). – MrDave1999 May 17 '20 at 18:24

0 Answers0