1
resposta

[Dúvida] Funcionamento do map por baixo dos panos

Ok, o map guarda um objeto no heap organizado com base em uma estrutura chave, valor, mas na minha cabeça só faz sentido isso ser realmente eficiente se ele faz com que objetos parecidos, com base em seus próprios parâmetros que n, forem pro mesmo canto, por exemplo, imagino que o map tenha uma inteligência interna capaz de jogar todos os alunos cujo a key começar com 5 para a direita do hep para assim poder começar a busca do aluno 5021 pela direita, afinal não faz diferença dividir todos os itens de uma caixa em caixas menores contendo um só item, vc ainda vai ter a mesma quantidade de itens pra checar. eu to certo em pensar assim? (sei que deve ter bem mais coisa debaixo dos panos, mas simplificar assim ta certo?) só to postando q não tenho certeza

1 resposta

Olá Guilherme, tudo bem?

Os hashmaps funcionam mapeando elementos para "buckets" usando uma função hash. Quando alguém tenta inserir um elemento, um código hash é calculado e uma operação de módulo é aplicada ao código hash para obter o índice do bucket no qual o elemento deve ser inserido. Por exemplo, se você tiver 4 buckets e seu hashcode for 40, ele será inserido no bucket 0, pois 40 mod 4 é 0.

Quando dois elementos são mapeados para o mesmo bucket, ocorre uma "colisão" e geralmente o elemento é armazenado em uma lista no mesmo bucket.

Se você tentar obter um elemento, a chave é mapeada novamente usando a função hash. Se o bucket contém uma lista de elementos, a função equals() é usada para identificar qual elemento é o correto (essa é a razão pela qual você deve implementar equals() e hashcode() para inserir um objeto personalizado em um hashmap ).

Portanto, se você procurar por um elemento e seu hashmap não tiver nenhuma lista nos buckets, você terá um custo O(1). O pior caso seria quando você tivesse apenas 1 bucket e uma lista contendo todos os elementos em que obter um elemento seria o mesmo que pesquisar em uma lista O(N).

Em resumo, quando um valor é colocado no HashMap , ele calcula um hash usando o objeto chave e, para isso, usa o método hashCode() da classe do objeto chave (ou sua classe pai). Com base no valor de hash calculado, a implementação do HashMap decide qual bucket deve armazenar o objeto.