Sobes.tech
Middle

Háblame sobre los contratos de los métodos equals y hashCode en Java.

sobes.tech AI

Respuesta de la IA

  • Reflexividad: para cualquier valor de referencia distinto de cero x, x.equals(x) debe devolver true.

  • Simetría: para cualquier par de valores de referencia distintos de cero x y y, x.equals(y) debe devolver true si y solo si y.equals(x) devuelve true.

  • Transitividade: para cualquier conjunto de valores de referencia distintos de cero x, y y z, si x.equals(y) devuelve true y y.equals(z) devuelve true, entonces x.equals(z) debe devolver true.

  • Consistência: para quaisquer valores de referência distintos de zero x e y, chamadas múltiplas ao método x.equals(y) devem retornar consistentemente true ou false, desde que nenhuma informação usada nas comparações equals nos objetos seja alterada entre as chamadas.

  • Para qualquer valor de referência distinto de zero x, x.equals(null) deve retornar false.

  • Se dois objetos são iguais de acordo com o método equals(Object), então a chamada do método hashCode para cada um dos dois objetos deve fornecer o mesmo valor inteiro.

  • Não é necessário que, se dois objetos não forem iguais de acordo com o método equals(java.lang.Object), a chamada do método hashCode para cada um dos dois objetos forneça valores inteiros diferentes. No entanto, o programador deve entender que gerar códigos hash diferentes para objetos não iguais pode melhorar o desempenho das tabelas hash.

É importante sobrescrever ambos os métodos equals e hashCode se um deles for sobrescrito, para manter o contrato. Usar equals sem sobrescrever hashCode pode levar a um funcionamento incorreto das coleções que usam hashing (por exemplo, HashMap, HashSet).

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Reflexividade
        if (o == null || getClass() != o.getClass()) return false; // Verificação de null e tipo
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Comparação por conteúdo
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Geração de hash com base nos campos
    }
}