Perguntas e respostas da entrevista do Hashmap [para iniciantes e experientes]
Publicados: 2020-09-24A classe de java.util.HashMap é de longe uma das bibliotecas mais importantes de Java. Raramente existe algum projeto escrito em java, e não utiliza a biblioteca do HashMap em sua implementação. É a maneira como essa estrutura de dados é implementada, o que a torna quase indispensável para qualquer programa relacionado a Java. HashMap, em sua definição, é muito simples. HashMap é uma estrutura de dados que é implementada usando uma abordagem muito tabular.
É correto dizer que se houvesse apenas uma estrutura de dados, deveria ser HashMap. Isso não é apenas muito útil, mas também muito eficiente em termos de tempo. Uma pesquisa simples no HashMap leva apenas cerca de O(1) tempo (o que significa que todas as pesquisas em um HashMap são feitas em tempo constante). Você encontrará muitas implementações de HashMap na linguagem de programação Java, como HashTable, concurrenthashmaps, etc. No entanto, se você estiver procurando por uma implementação geral, não deve se afastar muito do HashMap básico.
Cada uma dessas implementações do HashMap vem com seus próprios conjuntos de recursos e casos de uso. Se você deseja que a ordem em que você escreveu o mapeamento seja preservada, você deve usar o Linked HashMap. Se você deseja que o mapeamento do seu seja classificado, você deve usar a implementação TreeMap do HashMap, que faz a classificação para você.
De maneira semelhante, se você estiver procurando por uma tabela Hash que seja segura para threads, que também possa ser usada em um aplicativo simultâneo, mantendo a escalabilidade, você estará olhando para um HashMap simultâneo.
Como você pode ver, existem várias maneiras de usar o HashMap. Para saber realmente a importância do HashMap, você deve ver as perguntas da entrevista para qualquer perfil de trabalho de engenharia de software. Você não conseguirá otimizar o tempo adequadamente se não souber como implementar um HashMap corretamente. Portanto, se você é um programador, não pode deixar de aprender os meandros do HashMap. Por isso, listamos algumas perguntas pendentes de entrevista de hashmap abaixo, que devem ajudá-lo a se preparar para sua próxima entrevista.
Aprenda o curso de ciência de dados online das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.
Índice
Perguntas e respostas da entrevista do Hashmap
Q1. Como você usará o método put() do HashMap em Java?
Resp. O método put() simplesmente funciona usando o princípio conhecido como hash. Você faria uso desta função para armazenar o objeto em questão no backend (que é um array de memória). Você teria que usar outra função junto com esta função put() para poder determinar a posição exata desse objeto no backend. A função hashcode() é usada como a função auxiliar para put() da maneira que descrevemos anteriormente.
Portanto, a maneira como essas duas funções funcionam juntas é que elas procuram a chave disponível e a localização da memória no back-end. Se eles colidirem, o objeto que tem ambos os valores (ou seja, os valores de chave e valor) é adicionado a uma implementação dinâmica de uma lista, também conhecida como lista vinculada. A lista de curtidas aqui é armazenada no local de memória, que foi encontrado anteriormente.
Q2. Quais são as necessidades básicas que um objeto precisa ter para ser usado como chave ou valor de um HashMap?
Resp. Tanto a chave quanto o valor que usamos em qualquer HashMap e sua implementação também devem ter essas duas funções escritas neles. O nome dessas duas funções é equals() e hashcode(). A função que tem o nome de hashcode() é usada quando inserimos o valor da chave em qualquer HashMap. Ao mesmo tempo, a função equals() é chamada apenas quando estamos tentando recuperar o valor que já estava armazenado no HashMap.
Q3. Digamos que você perdeu o controle das chaves que já usou em seu HashMap. A próxima chave que você deseja adicionar já está presente no HashMap. O que você acha que vai acontecer nesse caso?
Resp. Se você acha que deve haver um erro, você não estará errado se não estivéssemos falando sobre HashMap. No entanto, se você estiver usando HashMap e inserir uma chave cujo valor já estava presente no hashmap, o compilador java não gerará nenhum erro. Em vez disso, o que vai acontecer é que o compilador irá apenas encontrar o valor associado à chave que você digitou e apenas atualizará o valor lá.
Se você usar a função put() para adicionar o valor ao hashmap, o valor de retorno dessa função seria o valor antigo associado a essa chave. Então, vamos supor que para a chave A, você tenha um valor armazenado de 1. Se você agora colocar o valor de A para ser, digamos 50, então o valor que será retornado pela função put() será 1 , e o valor final armazenado na chave A seria 50.
Q4. Caso surja a necessidade de armazenar um valor nulo. Você seria capaz de usar HashMap nesse caso?
Resp. Sim, poderíamos usar o hashmap nesse caso sem problemas, porque os hashmaps não reduzem o valor que você pode armazenar. Você pode armazenar quantos valores nulos desejar em qualquer hashmap.
Q5. Como a colisão é tratada com a implementação do hashmap em Java?
Resp. A biblioteca de código de java.util.HashMap usa o método de encadeamento para lidar com as colisões. A maneira como esse encadeamento funciona é que qualquer nova entrada no hashmap, que contém o par de chave e valor, seria armazenada em uma lista vinculada, e essa lista seria armazenada onde os dados existentes dos hashmaps residem (o local do bucket) .
No caso de todas as chaves que você tem em seu hashmap terem o mesmo hashcode, seu hashmap não será mais hashmap. Ele será transformado em uma lista vinculada. O tempo de pesquisa aumentará para a ordem de um (o(1)), ou seja, tempo constante, para a ordem de N (O(N)) que é o tempo linear.
Q6. Você será capaz de armazenar uma chave que tenha um valor nulo na implementação de um hashmap em Java?
Resp. Sim, na implementação do hashmap do java, você poderá armazenar chaves com um valor nulo. Mas você só poderá armazenar apenas uma dessas chaves, que sempre será armazenada no início da lista de baldes. O hashmap não chamará a função hashcode() aqui porque se essa função for usada em uma chave nula, ela lançará um erro de exceção de ponteiro nulo. Você terá que usar a função get em vez de usar o valor nulo como chave se quiser que o primeiro índice do seu hashmap seja retornado para você.

Leia: Classificação na estrutura de dados: categorias e tipos
Q7. Qual estrutura de dados você acha que o hashmap foi projetado para imitar?
Resp. O hashmap deve imitar a aparência e a funcionalidade da estrutura de dados da tabela de hash. A estrutura de dados da tabela de hash é sua escolha ideal se você deseja armazenar os valores na forma de um par de chave e valor. A principal razão pela qual essa tabela de hash é preferida é por causa do tempo de pesquisa. Portanto, se você tiver a chave que deseja pesquisar, em apenas uma ordem ou tempo constante, poderá obter de volta o valor desejado.
Q8. Como o hashmap não é uma das principais estruturas de dados, como estrutura ou matrizes. O que você acha que acontece nos bastidores sempre que você cria um mapa de hash? Qual combinação de estrutura de dados você acha que nos deu os hashmaps?
Resp. Mesmo que o hashmap realmente represente uma tabela de hash, mas sob o capô, ele não é implementado diretamente. Usamos duas estruturas de dados bem conhecidas para dar vida a um hashmap. Usamos uma lista encadeada e arrays. Uma lista encadeada é usada para armazenar o par de chave e valor dinamicamente, e o array é usado para armazenar todas essas listas encadeadas neles; juntos, eles formam um hashmap.
A partir do Java 8, se a lista encadeada se tornar suficientemente grande, então, em vez da lista encadeada, o Java implementa uma árvore de pesquisa binária. Essa alteração é feita para economizar tempo e melhorar o desempenho geral do hashmap.
Leia também: Perguntas da entrevista sobre ciência de dados
Q9. Caso queiramos armazenar vários valores sob a mesma chave, você acha que será possível na implementação do hashmap presente em Java?
Resp. Não, você não poderá armazenar chaves duplicadas no mapa de hash. Se você tentar armazenar um novo valor em uma chave já presente no hashmap, o hashmap simplesmente removerá o valor que foi armazenado anteriormente nessa chave e o substituirá pelo novo.
O tamanho do hashmap, neste caso, não mudaria, o que significa que não haverá adição de chaves no hashmap. Esse recurso é um dos motivos de usarmos a função keyset() para recuperar todas as chaves de um hashmap e essa função retornar um conjunto e não uma coleção (porque em um conjunto todos os valores têm que ser únicos).
Q10. Você poderá armazenar valores duplicados no HashMap?
Resp. Sim, você poderá armazenar valores duplicados no hashmap. Essa é a razão quando você recupera todos os valores do hashmap. Então, em vez de obter um conjunto, obtemos uma coleção. Ele não fornece o valor na forma de uma lista porque a ordenação não é garantida.
Q11. Na implementação do hashmap em Java, ele é seguro para threads?
Resp. Não, o Vanilla Hashmap não é seguro para threads em Java. Idealmente, você deve evitar compartilhar o hashmap com um encadeamento que possa alterar o valor e editar o hashmap em qualquer formato ou formato. Você pode, no entanto, usar um hashmap somente leitura e, em seguida, alimentá-lo no encadeamento. Desta forma, os valores contidos neles não serão alterados.
Q12. O que você acha que vai acontecer se usarmos o hashmap em um aplicativo que usa vários threads?
Resp. Se você passar um hashmap para um aplicativo que usa mais de um encadeamento, e cada um desses encadeamentos puder modificar, adicionar ou remover os valores armazenados no hashmap, os dados internos através dos quais o hashmap foi construído seriam corrompidos . Os links que foram usados para formar o hashmap desapareceriam, e então o hashmap perderia sua estrutura e seu propósito também seria perdido. Portanto, é sempre recomendado que você sempre use o hashmap thread-safe se for usá-los em um aplicativo que seja encadeado.
Q13. Se quisermos iterar todo o HashMap em Java. Quais são as diferentes maneiras pelas quais poderíamos fazer isso?
Resp. Há muitas maneiras de iterar sobre um hashmap em java; alguns deles estão listados abaixo:
- Você pode usar a função keySet juntamente com uma variável de iteração.
- Você pode usar a função enterySet juntamente com uma variável de iteração.
- Você pode usar a função entrySet e usá-la com um loop aprimorado.
- Você pode usar o keySet e obter um método.
Leia também: Estruturas de dados e algoritmos em Python: tudo o que você precisa saber
Qual o proximo?
Se você está curioso para aprender sobre ciência de dados, confira o Programa PG Executivo em Ciência de Dados do IIIT-B & upGrad, que é criado para profissionais que trabalham e oferece mais de 10 estudos de caso e projetos, workshops práticos práticos, orientação com especialistas do setor, 1 -on-1 com mentores do setor, mais de 400 horas de aprendizado e assistência de trabalho com as principais empresas.
Como um Hashtable é diferente de um HashMap?
Uma estrutura de dados não sincronizada é um HashMap. Uma Hashtable, por outro lado, é thread-safe e pode ser compartilhada entre muitos threads sem a necessidade de código de sincronização. Hashtable não permite uma chave nula ou vários valores nulos, mas HashMap permite. HashMap deve ser usado em vez de Hashtable em aplicativos não encadeados. Simplificando, o HashMap deve ser utilizado em aplicativos de thread único ou não sincronizados.
É mais rápido usar um HashMap ou um TreeMap?
Em um TreeMap, os valores são determinados pela chave. Ele não pode ter uma chave nula, mas pode ter vários valores nulos. É idêntico ao HashMap, exceto que em vez de ordem crescente, mantém a ordem crescente (Classificado usando a ordem natural de sua chave). HashMap emprega uma estrutura de dados baseada em array para organizar seus componentes de acordo com a função hash como uma implementação baseada em hashtable. Para a maioria das operações como add(), delete() e contém, o HashMap prevê o desempenho em tempo constante de O(1)(). Como resultado, é muito mais rápido que um TreeMap.
Quando é melhor usar HashMap em vez de um ArrayList?
Somente quando as chaves exclusivas estão disponíveis para os dados que desejamos armazenar, o HashMap faz sentido. Ao procurar coisas com base em uma chave, devemos usá-la, pois o tempo de acesso rápido é obrigatório. Quando manter a mesma ordem de entradas em uma coleção é fundamental, devemos evitar o HashMap. Ambos são distintos um do outro e servem a propósitos distintos. Se você deseja armazenar objetos em Java, use HashMap para mapear chaves para valores e ArrayList caso contrário.