Sobes.tech
Junior

Para que é que é utilizado o método hashCode?

sobes.tech IA

Resposta da IA

O método hashCode() em Java e Kotlin é usado para gerar um valor inteiro que representa um objeto. Desempenha um papel fundamental no funcionamento de coleções baseadas em tabelas de dispersão (HashMap, HashSet, Hashtable), onde é usado para determinar rapidamente a "caixa" (bucket) onde um objeto deve estar ou ser procurado. Pontos-chave:

  • Garantir o contrato equals e hashCode: Se dois objetos são considerados "iguais" pelo método equals(), então o seu hashCode() deve retornar o mesmo valor. O inverso não é verdadeiro: objetos diferentes podem ter o mesmo código hash (colisão).
  • Procura/Inserção rápida: O código hash é usado como índice para acesso rápido aos elementos em coleções de hash. Sem ele, a busca em coleções grandes seria muito mais lenta.
  • Não obrigatório: Se um objeto não for planejado para ser usado como chave em coleções de hash, a implementação padrão de hashCode() (geralmente baseada no endereço de memória) pode ser suficiente. No entanto, se equals() for sobrescrito, também deve-se sobrescrever hashCode() para manter o contrato.
  • Estabilidade: O valor de hashCode() para um objeto imutável deve permanecer constante durante toda a sua vida. Para objetos mutáveis, o código hash pode mudar, mas isso requer cautela ao usar em coleções de hash.

Exemplo de implementação básica em Kotlin:

data class User(val id: Long, val name: String)
// Para classes de dados, hashCode() e equals() são gerados automaticamente

Exemplo de implementação manual em Java (é importante combinar corretamente os valores):

class User {
    private final long id;
    private final String name;

    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
               Objects.equals(name, user.name); // Usamos Objects.equals para evitar NullPointerException
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name); // Usamos Objects.hash para combinar os códigos hash
    }
}