Avatar ·

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, como String, sobrescrevem esse método para comparar os valores reais.

No seu exemplo:

  • a == b é true porque ambas as variáveis apontam para a mesma string literal no pool de strings (Java reutiliza literais de string).
  • a == c é false porque c foi criado com new String(), que sempre cria um novo objeto na memória heap, diferente do literal.
  • a.equals(c) é true porque o método equals() da classe String compara o conteúdo das strings, que é idêntico.

Quando usar cada um:

  • Use == para comparar tipos primitivos (como int, 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.