Comparación entre string.equals() vs == en Java

Rashmi Patidar 15 febrero 2024
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.

Memoria de montón de cadenas y explicación de asignación de grupo constante

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 Patidar avatar Rashmi Patidar avatar

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

Artículo relacionado - Java String