Questions et réponses d'entrevue Hashmap [Pour débutants et expérimentés]

Publié: 2020-09-24

La classe de java.util.HashMap est de loin l'une des bibliothèques les plus importantes de Java. Il y a rarement un projet écrit en Java, et il n'utilise pas la bibliothèque de HashMap dans leur implémentation. C'est la façon dont cette structure de données est implémentée, ce qui la rend presque indispensable pour tout programme lié à Java. HashMap, dans sa définition, est très simple. HashMap est une structure de données implémentée à l'aide d'une approche très tabulaire.

On dit à juste titre que s'il n'y avait qu'une seule structure de données, ce devrait être HashMap. Non seulement c'est très utile mais aussi très efficace en termes de temps. Une simple recherche dans HashMap ne prend qu'environ O (1) temps (ce qui signifie que toute la recherche dans un HashMap est effectuée en temps constant). Vous trouverez de nombreuses implémentations de HashMap dans le langage de programmation de Java, telles que HashTable, concurrenthashmaps, etc. Cependant, si vous recherchez une implémentation générale, vous ne devez pas vous éloigner de HashMap de base.

Chacune de ces implémentations de HashMap est livrée avec ses propres ensembles de fonctionnalités et de cas d'utilisation. Si vous voulez que l'ordre dans lequel vous avez écrit le mappage soit préservé, vous devriez chercher à utiliser le Linked HashMap. Si vous souhaitez que votre mappage soit trié, vous devez utiliser l'implémentation TreeMap de HashMap, qui effectue le tri pour vous.

De la même manière, si vous recherchez une table de hachage qui se trouve être thread-safe, qui peut également être utilisée dans une application concurrente tout en conservant l'évolutivité, vous recherchez un HashMap concurrent.

Comme vous pouvez le constater, il existe différentes manières d'utiliser HashMap. Pour vraiment connaître l'importance de HashMap, vous devriez voir les questions d'entretien pour tout profil d'emploi en génie logiciel. Vous ne pourrez pas optimiser correctement le temps si vous ne savez pas comment implémenter correctement un HashMap. Donc, si vous êtes programmeur, vous ne pouvez pas vous passer d'apprendre les tenants et les aboutissants de HashMap. Nous avons donc répertorié ci-dessous quelques questions d'entretien hashmap en suspens, qui devraient vous aider à préparer votre prochain entretien.

Apprenez le cours de science des données en ligne des meilleures universités du monde. Gagnez des programmes Executive PG, des programmes de certificat avancés ou des programmes de maîtrise pour accélérer votre carrière.

Table des matières

Questions et réponses de l'entretien Hashmap

Q1. Comment allez-vous utiliser la méthode put() de HashMap en Java ?

Rép. La méthode put() fonctionne simplement en utilisant le principe connu sous le nom de hachage. Vous utiliseriez cette fonction pour stocker l'objet en question dans le backend (qui est un tableau de mémoire). Vous devrez utiliser une autre fonction avec cette fonction put() pour pouvoir déterminer la position exacte de cet objet dans le backend. La fonction hashcode() est utilisée comme fonction d'assistance pour put() de la manière que nous avons décrite précédemment.

Ainsi, la façon dont ces deux fonctions fonctionnent ensemble est qu'elles recherchent la clé disponible et l'emplacement de la mémoire dans le backend. S'ils se heurtent, l'objet qui a les deux valeurs (c'est-à-dire les valeurs de la clé et de la valeur) est alors ajouté dans une implémentation dynamique d'une liste, également appelée liste liée. La liste aimée ici est stockée dans l'emplacement de mémoire, qui a été trouvé précédemment.

Q2. Quels sont les besoins de base qu'un objet doit avoir pour être utilisé comme clé ou comme valeur d'un HashMap ?

Rép. La clé et la valeur que nous utilisons dans n'importe quel HashMap et son implémentation doivent également contenir ces deux fonctions. Le nom de ces deux fonctions est equals() et hashcode(). La fonction qui porte le nom de hashcode() est utilisée lorsque nous insérons la valeur de la clé dans n'importe quel HashMap. Dans le même temps, la fonction de equals () est appelée uniquement lorsque nous essayons de récupérer la valeur déjà stockée dans le HashMap.

Q3. Disons que vous avez perdu la trace des clés que vous avez déjà utilisées dans votre HashMap. La clé suivante que vous souhaitez ajouter est déjà présente dans le HashMap. Que pensez-vous qu'il va se passer dans ce cas ?

Rép. Si vous pensez qu'il devrait y avoir une erreur, vous ne vous tromperez pas si nous ne parlions pas de HashMap. Cependant, si vous utilisez HashMap et que vous insérez une clé dont la valeur était déjà présente dans le hashmap, le compilateur Java ne générera aucune erreur. Au lieu de cela, ce qui se passera, c'est que le compilateur ira simplement chercher la valeur associée à la clé que vous avez entrée, et il ne mettra à jour que la valeur là.

Si vous utilisez la fonction put() pour ajouter la valeur dans le hashmap, la valeur de retour de cette fonction serait l'ancienne valeur associée à cette clé. Donc, supposons que pour la clé A, vous avez une valeur stockée de 1. Si vous mettez maintenant la valeur de A à, disons 50, alors la valeur qui sera renvoyée par la fonction put() sera 1 , et la valeur finale stockée dans la clé A serait 50.

Q4. En cas de besoin de stocker une valeur nulle. Pourriez-vous utiliser HashMap dans ce cas ?

Rép. Oui, nous serions en mesure d'utiliser le hashmap dans ce cas sans aucun problème car les hashmaps ne réduisent pas la valeur que vous pouvez stocker. Vous pouvez stocker autant de valeurs nulles que votre cœur le souhaite dans n'importe quelle table de hachage.

Q5. Comment la collision est-elle gérée avec l'implémentation de hashmap en Java ?

Rép. La bibliothèque de code de java.util.HashMap utilise la méthode de chaînage pour gérer les collisions. La façon dont ce chaînage fonctionne est que toute nouvelle entrée dans le hashmap, qui contient à la fois la clé et la paire de valeurs, serait stockée dans une liste chaînée, et cette liste serait ensuite stockée là où résident les données existantes des hashmaps (l'emplacement du compartiment) .

Dans le cas où toutes les clés que vous avez dans votre hashmap s'avèrent avoir le même hashcode, alors votre hashmap ne sera plus hashmap. Il sera transformé en une liste chaînée. Le temps de recherche augmentera de l'ordre de un (o(1)), c'est-à-dire un temps constant, jusqu'à l'ordre de N (O(N)) qui est un temps linéaire.

Q6. Serez-vous capable de stocker une clé qui a une valeur nulle dans une implémentation Java de hashmap ?

Rép. Oui, dans l'implémentation Java du hashmap, vous pourrez stocker des clés avec une valeur nulle. Mais vous ne pourrez stocker qu'une seule clé de ce type, qui sera toujours stockée au début de la liste de compartiments. Le hashmap n'appellera pas la fonction hashcode() ici car si cette fonction est utilisée sur une clé nulle, il lancera une erreur Null Pointer Exception. Vous devrez utiliser la fonction get au lieu d'utiliser la valeur nulle comme clé si vous souhaitez que le premier index de votre hashmap vous soit renvoyé.

Lire : Trier dans la structure des données : catégories et types

Q7. Selon vous, quelle structure de données le hashmap est-il conçu pour imiter ?

Rép. Le hashmap est censé imiter l'apparence et la fonctionnalité de la structure de données de la table de hachage. La structure de données de la table de hachage est votre choix idéal si vous souhaitez stocker les valeurs sous la forme d'une paire clé/valeur. La principale raison pour laquelle cette table de hachage est préférée est le temps de recherche. Ainsi, si vous avez la clé que vous souhaitez rechercher, alors dans l'ordre d'un temps constant ou constant, vous pourrez récupérer la valeur souhaitée.

Q8. Étant donné que hashmap n'est pas l'une des structures de données de base comme la structure ou les tableaux. Selon vous, que se passe-t-il sous le capot chaque fois que vous créez un hashmap ? Selon vous, quelle combinaison de structure de données nous a donné les hashmaps ?

Rép. Même si le hashmap représente en fait une table de hachage, mais sous le capot, il n'est pas directement implémenté. Nous utilisons deux structures de données bien connues pour donner vie à une hashmap. Nous utilisons une liste chaînée et des tableaux. Une liste chaînée est utilisée pour stocker dynamiquement la paire clé-valeur, et le tableau est utilisé pour y stocker toutes ces listes chaînées ; ensemble, ils forment une carte de hachage.

À partir de Java 8, si la liste chaînée devient suffisamment grande, alors au lieu de la liste chaînée, Java implémente un arbre de recherche binaire à la place. Cette modification est effectuée pour gagner du temps et améliorer les performances globales de hashmap.

Lisez aussi: Questions d'entrevue en science des données

Q9. Au cas où nous voudrions stocker plusieurs valeurs sous la même clé, pensez-vous que ce sera possible dans l'implémentation de hashmap présente en Java ?

Rép. Non, vous ne pourrez pas stocker de clés en double dans le hashmap. Si vous essayez de stocker une nouvelle valeur dans une clé déjà présente dans le hashmap, le hashmap supprimera simplement la valeur précédemment stockée dans cette clé et la remplacera par la nouvelle.

La taille du hashmap, dans ce cas, ne changerait pas, ce qui signifie qu'il n'y aura pas d'ajout de clés dans le hashmap. Cette fonctionnalité est l'une des raisons pour lesquelles nous utilisons la fonction keyset() pour récupérer toutes les clés d'un hashmap et que cette fonction renvoie un ensemble et non une collection (car dans un ensemble toutes les valeurs doivent être uniques).

Q10. Serez-vous capable de stocker des valeurs en double dans HashMap ?

Rép. Oui, vous pourrez stocker des valeurs en double dans le hashmap. C'est la raison pour laquelle vous récupérez toutes les valeurs du hashmap. Ensuite, au lieu d'obtenir un ensemble, nous obtenons une collection. Il ne donne pas la valeur sous forme de liste car l'ordre n'est pas garanti.

Q11. Dans l'implémentation Java du hashmap, est-il thread-safe ?

Rép. Non, le hashmap vanille n'est pas du tout thread-safe en Java. Idéalement, vous devriez éviter de partager le hashmap avec un thread qui peut modifier la valeur et modifier le hashmap sous n'importe quelle forme. Vous pouvez cependant utiliser un hashmap en lecture seule, puis l'alimenter dans le thread. De cette façon, les valeurs qu'ils contiennent ne changeront pas.

Q12. Que pensez-vous qu'il va se passer si nous utilisons le hashmap dans une application qui utilise plusieurs threads ?

Rép. S'il vous arrive de passer un hashmap à une application qui utilise plus d'un thread, et que chacun de ces threads peut modifier, ajouter ou supprimer les valeurs qui sont stockées dans le hashmap, alors les données internes à travers lesquelles le hashmap a été construit seraient corrompues . Les liens qui ont été utilisés pour former le hashmap disparaîtraient, puis le hashmap perdrait sa structure, et son objectif serait également perdu. Par conséquent, il est toujours recommandé de toujours utiliser le hashmap thread-safe si vous devez les utiliser dans une application qui est threadée.

Q13. Si nous voulons parcourir l'intégralité de HashMap en Java. Quelles sont les différentes façons dont nous pourrions le faire?

Rép. Il existe de nombreuses façons de parcourir un hashmap en Java ; Certains d'entre eux sont énumérés ci-dessous:

  1. Vous pouvez utiliser la fonction keySet couplée à une variable itérative.
  2. Vous pouvez utiliser la fonction enterySet couplée à une variable d'itération.
  3. Vous pouvez utiliser la fonction entrySet et l'utiliser avec une boucle améliorée.
  4. Vous pouvez utiliser le keySet et obtenir une méthode.

Lisez aussi : Structures de données et algorithme en Python : tout ce que vous devez savoir

Et ensuite ?

Si vous êtes curieux d'en savoir plus sur la science des données, consultez le programme Executive PG en science des données de IIIT-B & upGrad qui est créé pour les professionnels en activité et propose plus de 10 études de cas et projets, des ateliers pratiques, un mentorat avec des experts de l'industrie, 1 -on-1 avec des mentors de l'industrie, plus de 400 heures d'apprentissage et d'aide à l'emploi avec les meilleures entreprises.

En quoi un Hashtable est-il différent d'un HashMap ?

Une structure de données non synchronisée est un HashMap. Une table de hachage, en revanche, est thread-safe et peut être partagée entre plusieurs threads sans nécessiter de code de synchronisation. Hashtable n'autorise pas une clé nulle ou plusieurs valeurs nulles, mais HashMap le permet. HashMap doit être utilisé à la place de Hashtable dans les applications sans thread. En termes simples, HashMap doit être utilisé dans des applications à un seul thread ou non synchronisées.

Est-il plus rapide d'utiliser un HashMap ou un TreeMap ?

Dans un TreeMap, les valeurs sont déterminées par la clé. Il ne peut pas avoir de clé nulle, mais il peut avoir plusieurs valeurs nulles. Il est identique à HashMap, sauf qu'au lieu de l'ordre croissant, il conserve l'ordre croissant (trié en utilisant l'ordre naturel de sa clé). HashMap utilise une structure de données basée sur un tableau pour organiser ses composants en fonction de la fonction de hachage en tant qu'implémentation basée sur une table de hachage. Pour la plupart des opérations telles que add(), delete() et contains, HashMap prévoit les performances en temps constant de O(1) (). En conséquence, il est beaucoup plus rapide qu'un TreeMap.

Quand est-il préférable d'utiliser HashMap au lieu d'un ArrayList ?

Ce n'est que lorsque des clés uniques sont disponibles pour les données que nous souhaitons stocker que HashMap a du sens. Lorsque nous recherchons des éléments basés sur une clé, nous devons l'utiliser car un temps d'accès rapide est indispensable. Lorsque le maintien du même ordre des entrées dans une collection est essentiel, nous devons éviter HashMap. Ils sont tous deux distincts les uns des autres et ont des objectifs distincts. Si vous souhaitez stocker des objets en Java, utilisez HashMap pour mapper les clés aux valeurs et ArrayList sinon.