Comparação entre string.equals() vs == em Java

Rashmi Patidar 15 fevereiro 2024
Comparação entre string.equals() vs == em Java

Em Java, existem dois tipos de comparação de objetos. O primeiro é que o operador == opera no trabalho com os endereços. Ele compara internamente as referências dos objetos. Por outro lado, o método equals compara o conteúdo real das instâncias.

Abaixo está o bloco de código para demonstrar os operadores e seu comportamento.

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);
  }
}

No bloco de código acima, três instâncias de string são definidas. As classes de string são imutáveis ​​por natureza. A imutabilidade significa que a instância criada nunca pode ser substituída.

Além disso, as variáveis ​​mantêm a memória no local do heap. Portanto, ao criar a string name, ela é salva na memória heap. Quando outra nova instância, str2 com o mesmo valor name, é inicializada, a JVM não cria outro novo endereço para ela. Em vez disso, ele atribui a referência da instância str1 à variável str2.

O fato é a prova quando tentamos comparar str1==str2 a ambas as instâncias de string. As afirmações resultam em verdadeiras, pois ambas as referências apontam para o mesmo endereço de nome na memória. O fato explicado pode ser melhor compreendido no diagrama abaixo.

Explicação sobre memória heap de string e alocação de pool constante

Da mesma forma, quando o método equals é aplicado a ambas as instâncias, resulta no valor booleano true. Como a função funciona na comparação de conteúdo, ela é igual.

Em seguida, outra variável de string str3 é inicializada usando a palavra-chave new. A JVM criará internamente um novo espaço na memória heap para o endereço name em vez de atribuir a instância à variável str3. Portanto, quando a comparação de conteúdo é feita, ela retorna true na função equals. Ele retorna false quando o endereço é comparado usando o operador ==.

Aqui está a saída do bloco de código acima.

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

Artigo relacionado - Java String