HOWTO · Java
Comparação entre string.equals() vs == em Java
Este artigo apresenta a diferença entre String equals e == 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.

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