Pergunta de entrevista para Desenvolvedor Java

Qual é o contrato entre equals e hashCode, e o que quebra se você errar?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

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

Exemplo falado, em primeira pessoa

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 funciona

Perguntas 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

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot