Con el == , a veces PARECE que funciona, pero solo lo parece y depende del origen de los datos.
Por ejemplo, este código.
En pantalla saldrá el resultado: Verdadero
Y podemos pensar que se debe a que ambos String tienen el mismo valor.
Pero no es ese el motivo.
Ahí lo que ocurre es que ambos String están apuntando a la MISMA constante. En Java, cuando en el código ponemos una cadena entre las comillas, aunque no lo parezca estamos creando una constante.
Y eso es lo que comprueba el operador ==, si dos referencias están
apuntando a un mismo valor. Cosa que es diferente de si dos referencias,
tienen el mismo valor.
Ahora bien, si lo cambiamos por este código, donde sus valores van a tener otro origen. Esta vez lo recibirán por teclado:
Aunque escribamos exactamente la misma cadena para ambos String, al comparar con == nos dirá que NO SON IGUALES
Bueno, en realidad lo que nos está diciendo, es que están apuntando a distintos valores.
Los valores en realidad, son iguales (o más correcto decir,
equivalentes), pero son DOS objetos distintos porque se han originado en dos procesos distintos.
Cada entrada de datos, con teclado.nextLine(), han producido objetos distintos, cada uno con su propia dirección de memoria.
En el ejemplo anterior, los datos provenían de una misma constante, ubicada en una única dirección de memoria, así que teníamos dos referencias a esa misma dirección.
Eso es lo que comprueba el operador ==
En cambio equals(), sí hace una comparación de los valores para juzgar si hay una equivalencia
En pantalla veremos que cada forma de comparar, da un resultado distinto, y solo equals() está acertando:
Así que siempre que comparemos objetos, de cualquier clase, debemos usar equals()
Aquí hay que añadir que para la clase String, Integer, Double,... y todas o la mayoría de clases que vienen ya predefinidas en Java, el método equals() funciona porque alguien ha
sobreescrito este método con el código necesario para que funcione y los String sepan como han de compararse para decidir si son equivalentes o no.
En el caso de que estemos usando clases nuestras, escritas por nosotros, las típicas clase Persona, Alumno, Coche, Perro,... y cualquier otra que sea de nuestra propia creación, el método equals() NO funcionará, si previamente no lo sobreescribimos nosotros para enseñarle a nuestra clase como ha de compararse para decidir su equivalencia.
A una Persona le diremos que son iguales si tienen el mismo DNI (aunque no coincidan sus atributos nombre y apellidos), a un Coche le diremos que son iguales si tienen la misma matricula o el mismo nº de chasis (aunque su atributo color o nº de asientos difieran), dos Perros serán iguales si tienen el mismo chip identificador(aunque su atributo raza o color de pelo sean distintos), etc...