Um HashMap guarda um array de buckets. O hash da chave é espalhado misturando os bits altos, depois o índice é esse hash mascarado contra o tamanho da tabela, que é sempre uma potência de dois. Colisões formam uma lista encadeada no bucket, e um bin com pelo menos oito entradas numa tabela de pelo menos sessenta e quatro vira uma árvore rubro negra. Passando do fator de carga de 0,75 a tabela dobra e as entradas são reidratadas com novo hash.
Por que os entrevistadores perguntam isso
O entrevistador está testando se você entende a estrutura de dados que usa em toda classe, em vez de recitar que ela é rápida. Os detalhes de treeification e resize mostram conhecimento atual, já que a implementação mudou no Java 8. Também leva naturalmente ao porquê de chaves serem imutáveis, ao porquê de um hash ruim degradar a performance e ao porquê de HashMap não ser seguro sob escritas concorrentes.
Como estruturar sua resposta
- Descreva o array de buckets e como o índice é derivado.
- Explique o tratamento de colisões e a troca de lista para árvore.
- Cubra fator de carga, resize e o custo do rehash.
- Tire as conclusões práticas sobre design de chave e thread safety.
Exemplo de resposta
Internamente é um array de bins. O hashCode da chave é espalhado com um ou exclusivo que traz os bits altos para baixo, e isso importa porque o índice é só o hash mascarado com o tamanho da tabela menos um, então sem essa mistura só os bits baixos seriam usados. Entradas que colidem encadeiam nesse bin, e desde o Java 8 um bin que passa de oito entradas, quando a tabela tem pelo menos sessenta e quatro, vira uma árvore rubro negra, então a busca no pior caso é logarítmica em vez de linear. Isso foi uma resposta a ataques de negação de serviço por colisão de hash. O crescimento é guiado pelo fator de carga, então com 0,75 de ocupação a tabela dobra e tudo é redistribuído, por isso dimensionar o mapa antes importa se eu sei que ele vai guardar um milhão de entradas. As consequências práticas com que me importo são que chaves devem ser imutáveis, que um hashCode ruim faz tudo cair num bin só, e que escritas concorrentes podem corromper a tabela, então mapas compartilhados usam ConcurrentHashMap em vez de lock externo.
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
- Por que o tamanho da tabela é sempre uma potência de dois?
- O que o ConcurrentHashMap faz de diferente para permitir escritas concorrentes?
- Quando você preferiria LinkedHashMap ou TreeMap?
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