Comparación entre string.equals() vs == en Java
En Java, hay dos tipos de comparación de objetos. El primero es el operador ==
que opera trabajando con las direcciones. Compara internamente las referencias de los objetos. Por otro lado, el método equals
compara el contenido real de las instancias.
A continuación se muestra el bloque de código para demostrar los operadores y su comportamiento.
public class Main {
public static void main(String[] args) {
String str1 = "name";
String str2 = "name";
String str3 = new String("name");
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
System.out.println(str1.equals(str3));
System.out.println(str3 == str1);
}
}
En el bloque de código anterior, se definen tres instancias de cadena. Las clases de cadenas son de naturaleza inmutable. La inmutabilidad significa que la instancia que se crea nunca se puede anular.
Además, las variables mantienen la memoria en la ubicación del montón. Entonces, al hacer que la cadena sea name
, se guarda en la memoria del montón. Cuando se inicializa otra nueva instancia, str2
con el mismo valor de name
, la JVM no crea otra nueva dirección para ella. En cambio, asigna la referencia de la instancia str1
a la variable str2
.
El hecho sostiene la prueba cuando tratamos de comparar str1==str2
con ambas instancias de cadena. Los resultados de las declaraciones son true
ya que ambas referencias apuntan a la misma dirección de nombre en la memoria. El hecho explicado se puede entender mejor en el diagrama siguiente.
De manera similar, cuando el método equals
se aplica a ambas instancias, da como resultado el valor booleano true
. Como la función trabaja en la comparación de contenido, es igual.
A continuación, se inicializa otra variable de cadena str3
utilizando la palabra clave new
. La JVM creará internamente un nuevo espacio en la memoria del montón para la dirección name
en lugar de asignar la instancia a la variable str3
. Entonces, cuando se realiza la comparación de contenido, devuelve true
en la función equals
. Devuelve false
cuando se compara la dirección utilizando el operador ==
.
Aquí está la salida del bloque de código anterior.
true
true
true
false
Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.
LinkedIn