Se dois objetos são iguais por equals, eles precisam retornar o mesmo hashCode; objetos diferentes podem compartilhar um hash, mas idealmente não compartilham. Quebre isso e as coleções baseadas em hash se comportam mal: um objeto colocado num HashMap fica inalcançável porque a busca vai para outro bucket. equals também precisa ser reflexivo, simétrico, transitivo e consistente, e mutar um campo usado no hash depois da inserção perde a entrada com a mesma eficiência.
Por que os entrevistadores perguntam isso
É uma checagem de fundamentos que prevê bugs reais, principalmente em bases de código que usam entidades como chave de mapa ou em sets. O entrevistador quer a implicação de mão única enunciada corretamente, mais a falha prática: um set que contém um item que ele não consegue encontrar. Os follow ups normalmente vão para entidades JPA, onde equals sobre um id gerado é uma armadilha clássica, e para records, que geram os dois para você.
Como estruturar sua resposta
- Enuncie o contrato como uma implicação, não uma equivalência.
- Descreva a falha concreta em um HashMap ou HashSet.
- Cite a mutabilidade dos campos usados no hash.
- Diga o que você faz na prática: records, ou uma chave de negócio estável.
Exemplo de resposta
A regra é unidirecional: objetos iguais precisam ter hash codes iguais, mas hash codes iguais não implicam igualdade, e é por isso que o mapa ainda chama equals dentro do bucket. Se eu sobrescrevo equals e esqueço hashCode, dois objetos que são iguais caem em buckets diferentes, então eu posso colocar algo num HashSet e depois ter contains retornando false para um objeto idêntico. A versão mais sutil é a mutação. Se um campo usado no hash muda depois que o objeto já está no set, a entrada agora está no bucket errado e está efetivamente perdida, o que aparece como vazamento porque ela nunca poderá ser removida também. Na prática eu uso records para tipos de valor, assim os dois são gerados e ficam consistentes. Para entidades JPA eu tomo cuidado, porque usar um id gerado significa que equals muda quando a entidade é persistida, então uma entidade num HashSet antes do flush se comporta de forma diferente depois. Eu uso uma chave natural ou de negócio estável quando existe uma, e no resto evito colocar entidades não salvas em coleções baseadas em hash.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Como você implementaria equals para uma entidade JPA com id gerado?
- O que um record gera para você, e quando isso não é o que você quer?
- Por que uma função de hash ruim degrada um HashMap mesmo estando correta?
Mais perguntas para Desenvolvedor Java
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas