Qual é a diferença entre == e equals() em Java?
Olá, colegas! Acabei de começar a estudar Java e me deparei com uma situação confusa ao comparar strings. Escrevi um código simples:
```java
String a = "Привет";
String b = "Привет";
String c = new String("Привет");
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true
```
Por que `a == b` retorna `true`, mas `a == c` retorna `false`? E qual é o papel do `equals()`? Eu pensava que ambos os operadores comparam valores. Qual é o truque? Explique, por favor, como para um iniciante, quando usar `==` e quando usar `equals()`. Estou especialmente interessado em como isso funciona com strings e outros objetos.
<<>>
Diferença principal: comparação de referências vs comparação de conteúdo
A diferença chave entre == e equals() em Java é o que exatamente eles comparam:
==— é um operador de comparação de referências. Ele verifica se duas variáveis apontam para o mesmo objeto na memória.equals()— é um método que compara o conteúdo dos objetos. Por padrão, ele também compara referências (como o==), mas muitas classes, comoString, sobrescrevem esse método para comparar os valores reais.
No seu exemplo:
a == bétrueporque ambas as variáveis apontam para a mesma string literal no pool de strings (Java reutiliza literais de string).a == céfalseporquecfoi criado comnew String(), que sempre cria um novo objeto na memória heap, diferente do literal.a.equals(c)étrueporque o métodoequals()da classeStringcompara o conteúdo das strings, que é idêntico.
Quando usar cada um:
- Use
==para comparar tipos primitivos (comoint,boolean) ou para verificar se duas referências apontam para o mesmo objeto. - Use
equals()para comparar o conteúdo de objetos, especialmente strings e outras classes que sobrescrevem esse método.
Para objetos personalizados, você deve sobrescrever o método equals() (e hashCode()) se quiser comparar por conteúdo. Lembre-se: == sempre compara referências, enquanto equals() pode ser personalizado para comparar valores.