Sobes.tech
Junior

O que faz o método equals() em Java?

sobes.tech IA

Resposta da IA

O método equals() em Java é usado para comparar dois objetos quanto à igualdade. Por padrão, no caso de objetos que herdam de Object sem sobrescrita, ele compara referências de objetos (==), ou seja, verifica se as variáveis apontam para o mesmo local de memória.

Sobrescrever corretamente o método equals() é importante para comparar objetos pelo seu conteúdo, e não pela sua localização na memória.

Ao sobrescrever equals(), deve-se seguir as seguintes regras:

  • Reflexividade: para qualquer objeto não nulo x, x.equals(x) deve retornar true.
  • Simetria: para quaisquer objetos não nulos x e y, se x.equals(y) retorna true, então y.equals(x) também deve retornar true.
  • Transitividade: para quaisquer objetos não nulos x, y e z, se x.equals(y) retorna true e y.equals(z) retorna true, então x.equals(z) também deve retornar true.
  • Consistência: para quaisquer objetos não nulos x e y, múltiplas chamadas a x.equals(y) devem devolver consistentemente o mesmo resultado, desde que as informações usadas para a comparação não mudem entre chamadas.
  • Para qualquer objeto não nulo x, x.equals(null) deve retornar false.

Normalmente, ao sobrescrever equals(), também se deve sobrescrever o método hashCode(), mantendo o contrato: se dois objetos são iguais segundo equals(), seus códigos de hash, retornados por hashCode(), devem ser iguais. A reciprocidade não é obrigatória: se os códigos de hash são iguais, os objetos não necessariamente são iguais.

Exemplo de sobrescrita:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Comparação em si
        if (this == o) return true;
        // Verificação de null e tipo de objeto
        if (o == null || getClass() != o.getClass()) return false;
        // Conversão de tipo e comparação por campos
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Geração do código hash baseada nos campos
        return Objects.hash(value, name);
    }

    // getters, setters, etc.
}