Sobes.tech
Middle

Quais são as regras para os métodos equals e hashCode?

sobes.tech IA

Resposta da IA

  1. Se dois objetos forem iguais pelo método equals(Object), os seus códigos de hash (retornados pelo método hashCode()) devem ser iguais.
  2. Se dois objetos não forem iguais pelo método equals(Object), os seus códigos de hash podem ser iguais ou diferentes. É uma boa prática garantir códigos de hash diferentes para objetos não iguais para melhorar o desempenho das coleções baseadas em hash.
  3. O método hashCode() deve retornar valores iguais para o mesmo objeto em múltiplas chamadas, desde que nenhuma informação usada para calcular o código de hash tenha mudado.
  4. Simetria: para quaisquer objetos a e b, se a.equals(b) for true, então b.equals(a) também deve ser true.
  5. Reflexividade: para qualquer objeto não nulo a, a.equals(a) deve ser true.
  6. Transitividade: para quaisquer objetos a, b e c, se a.equals(b) for true e b.equals(c) for true, então a.equals(c) também deve ser true.
  7. Consistência: para quaisquer objetos não nulos a e b, múltiplas chamadas a a.equals(b) devem retornar de forma consistente true ou false, desde que as informações usadas nas comparações equals(Object) não tenham mudado.

Exemplo de implementação:

public class MyClass {

    private int value;
    private String name;

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

    @Override
    public boolean equals(Object o) {
        // Verificação de identidade de objetos
        if (this == o) {
            return true;
        }
        // Verificação do tipo do objeto
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Casting para o tipo correto
        MyClass myClass = (MyClass) o;
        // Comparação por campos
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Usamos Objects.equals para tratar nulls
    }

    @Override
    public int hashCode() {
        // Uso de Objects.hash para gerar o hash code com base nos campos
        return Objects.hash(value, name);
    }

    // Outros métodos...
}