9.Collection de questions d'entrevue de code source de carte

1. Quelle est la structure de données sous-jacente de HashMap?
Réponse: La structure de données sous-jacente de HashMap est une combinaison de tableaux, de listes chaînées et d'arbres rouge-noir. La fonction principale des tableaux est de faciliter la recherche rapide. La complexité temporelle est O (1), la taille par défaut est 16 et l'indice d'indice du tableau est le hashcode de la clé. informatique. L'élément du tableau s'appelle Node. Lorsque plusieurs clés ont le même code de hachage mais des valeurs de clé différentes, un seul nœud est converti en liste liée. La complexité de la requête de la liste liée est O (n). Lorsque la longueur de la liste liée est supérieure ou égale à 8 et que la taille du tableau dépasse 64 , La liste chaînée sera transformée en un arbre rouge-noir. La complexité de la requête de l'arbre rouge-noir est O (log (n)). En termes simples, les pires temps de requête sont équivalents à la profondeur maximale de l'arbre rouge-noir.

2. Quelle est la différence entre HashMap, TreeMap et LinkedHashMap?
Réponse: Les trois utiliseront des arbres rouge-noir dans certaines circonstances, et l'algorithme de hachage sous-jacent est le même. Dans le processus itératif, si la structure de données de la carte est modifiée, ConcurrentModificationException sera signalée.
La différence est que la structure de données HashMap est principalement un tableau et que la requête est très rapide. La structure de données TreeMap est principalement un arbre rouge-noir. Il utilise les caractéristiques de l'arbre rouge-noir pour être petit à gauche et grand à droite pour effectuer le tri par clé. LinkedHashMap est basé sur HashMap. La structure de la liste chaînée est augmentée et les deux stratégies d'accès à l'ordre d'insertion et de suppression de moindre accès sont réalisées. En raison de la différence dans la structure de données sous-jacente des trois cartes, les scénarios d'utilisation des trois sont différents. TreeMap convient aux scènes qui doivent être triées en fonction de la clé, LinkedHashMap convient aux scènes qui accèdent selon l'ordre d'insertion ou doivent supprimer les éléments les moins visités, et les scènes restantes utilisent HashMap.

3. Parlez-moi de l'algorithme de hachage de Map?
Réponse: Dans le code source, le hachage est calculé à l'aide du code suivant. Tout d'abord, le hachage de la clé est calculé. La clé étant Object, le hashcode est calculé en fonction des différents types de clés, puis h ^ (h >>> 16) est calculé, donc L'avantage de faire cela est de garantir que la valeur de hachage calculée est relativement dispersée dans la plupart des scénarios.
En règle générale, une fois la valeur de hachage calculée, il est nécessaire de calculer la position d'indice d'index de la clé actuelle dans le tableau. Ici, la méthode modulo est adoptée. Position d'indice d'index = valeur de hachage% taille du tableau. L'avantage est que l'index calculé peut être garanti. La valeur standard est répartie uniformément dans chaque position d'index du tableau, mais le calcul de l'opération modulo est relativement lent. Il existe une formule en mathématiques. Lorsque b est une puissance de 2, a% b = a & (b- 1), donc la formule de calcul de la position d'index ici peut être remplacée par (n-1) & hash.

static final int hash(Object key) {
    
    
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

4. Pourquoi ne pas utiliser la clé% taille du tableau, mais vous devez utiliser la valeur de hachage de clé% taille du tableau?
Réponse: Si la clé est un nombre, l'utilisation directe de la clé% array size n'est pas un problème, mais la clé peut également être une chaîne, qui est un objet complexe. Pour le moment, l'utilisation d'une chaîne ou d'un objet complexe% array size n'est pas acceptable, vous devez donc d'abord Calculez la valeur de hachage de la clé.

5. Pourquoi devons-nous décaler 16 bits vers la droite lors du calcul de la valeur de hachage?
Réponse: L'algorithme de hachage est h ^ (h >>> 16). Afin de rendre la valeur de hachage calculée plus dispersée, nous choisissons de décaler d'abord h non signé de 16 bits, puis XOR avec h pour faire h Les 16 bits hauts et les 16 bits bas participent au calcul, ce qui réduit la possibilité de collision.

6. Pourquoi l'opération modulo est-elle remplacée par l'opération &?
Réponse: La valeur de hachage calculée par key.hashCode () n'est pas l'indice d'index du tableau. Pour calculer la position d'indice de l'index de manière aléatoire, il est également nécessaire d'utiliser la valeur de hachage et la taille du tableau pour prendre le module, de sorte que la distribution d'indice d'index calculé Ce sera plus égal. Le calcul du processeur de fonctionnement modulo est relativement lent, et il est remplacé par & operation, qui est soutenu par des preuves mathématiques, ce qui améliore la vitesse de traitement du processeur.

7. Pourquoi préconise-t-on que la taille du tableau soit une puissance de 2?
Réponse: Parce que ce n'est que lorsque la taille est une puissance de 2, que le hachage% n (taille du tableau) = (n-1) et le hachage peuvent être vrais.

8. Comment HashMap se développe-t-il?
Réponse: Il existe deux possibilités d'expansion: la première est lorsque la baie est vide lors de l'installation et l'expansion est effectuée lors de l'initialisation. La taille d'extension par défaut est 16. Deuxièmement, une fois le put réussi, lorsqu'il est constaté que la taille de la matrice existante est supérieure au seuil d'extension, l'extension est effectuée et l'extension est deux fois la taille de l'ancienne matrice. Le seuil d'expansion est le seuil. Le seuil sera recalculé à chaque expansion. Le seuil est égal à la taille du facteur d'impact de la baie * (0,75). Une fois le nouveau tableau initialisé, les valeurs de l'ancien tableau doivent être copiées dans le nouveau tableau. Les listes liées et les arbres rouge-noir ont leurs propres méthodes de copie.

9. Que faire en cas de conflit de hachage?
Réponse: Le conflit de hachage fait référence à la situation dans laquelle le calcul du hashcode de la valeur de clé est le même, mais la valeur de clé est différente. S'il n'y a qu'un seul élément dans le compartiment ou s'il s'agit déjà d'une liste liée, le nouvel élément est directement ajouté à la fin de la liste liée. Si les éléments du compartiment sont déjà des listes liées et que le nombre de listes liées est supérieur ou égal à 8, il existe deux situations pour le moment. Si la taille du tableau est inférieure à 64 à ce stade, le tableau est de nouveau développé et la liste liée ne sera pas convertie en un arbre rouge-noir. Si la taille du tableau est supérieure à 64, la liste chaînée sera convertie en un arbre rouge-noir. Ici non seulement juge si le nombre de listes chaînées est supérieur ou égal à 8, mais juge également la taille du tableau. La raison pour laquelle la capacité de la baie est inférieure à 64 n’est pas convertie immédiatement. On suppose que l’arbre rouge-noir occupe beaucoup plus d’espace que la liste chaînée et que la conversion prend également beaucoup de temps. Par conséquent, si la capacité de la baie est faible, le conflit est sérieux, vous pouvez commencer par essayer d’augmenter la capacité.

10. Pourquoi la liste chaînée devrait-elle être transformée en un arbre rouge-noir lorsque le nombre de listes chaînées est supérieur ou égal à 8?
Réponse: Lorsqu'il y a trop de listes chaînées, le parcours prendra plus de temps. La conversion en un arbre rouge-noir peut réduire la complexité temporelle du parcours, mais la conversion en un arbre rouge-noir entraîne des coûts de conversion en espace et en temps, qui sont distribués via Poisson Calcul de formule, dans des circonstances normales, la probabilité que le nombre de listes liées apparaisse 8 est inférieure à une sur dix millions, donc dans des circonstances normales, la liste liée ne sera pas transformée en un arbre rouge-noir. Le but de cette conception est d'éviter les situations anormales (telles que l'algorithme de hachage n'est pas applicable), lorsque le nombre de listes chaînées est supérieur ou égal à 8, toujours capables de traverser rapidement.

11. Quand l'arbre rouge-noir sera-t-il converti en liste chaînée?
Réponse: Lorsque le nombre de nœuds est inférieur ou égal à 6, l'arbre rouge-noir sera automatiquement converti en liste chaînée. La principale considération est le coût d'espace de l'arbre rouge-noir. Lorsque le nombre de nœuds est inférieur ou égal à 6 Lorsque vous parcourez la liste liée sera très rapide, l'arbre rouge-noir redeviendra une liste liée.

12. Lorsque HashMap est placé, que dois-je faire si la clé existe déjà dans le tableau et que je ne veux pas écraser la valeur? Que dois-je faire si je souhaite revenir à la valeur par défaut lorsque la valeur obtenue est vide?
Réponse: Si le tableau a une clé, mais que vous ne voulez pas écraser la valeur, vous pouvez choisir la méthode putIfAbsent. Cette méthode a une variable intégrée onlyIfAbsent. Si la variable intégrée est true, elle ne sera pas écrasée. La méthode put généralement utilisée, la méthode intégrée onlyIfAbsent est false, ce qui permet l'écrasement. .
Lorsque vous prenez une valeur, si elle est vide et que vous souhaitez revenir à la valeur par défaut, vous pouvez utiliser la méthode getOrDefault. Le premier paramètre de la méthode est key et le second paramètre est la valeur par défaut renvoyée, telle que map.getOrDefault ("2", "0") , Lorsqu'il n'y a pas de valeur de clé 2 dans la carte, elle retournera 0 par défaut au lieu de vide.

13. Que signifie LRU dans LinkedHashMap et comment est-il implémenté?
Réponse: LRU (le moins récemment utilisé), également appelé stratégie de suppression du moins d'accès dans LinkedHashMap, peut définir une certaine stratégie via la méthode removeEldestEntry, de sorte que l'élément le moins consulté soit supprimé au moment opportun.
À la fin de l'exécution de la méthode put, LinkedHashMap vérifiera cette stratégie et supprimera le nœud principal si la stratégie est respectée. Lorsque LinkedHashMap obtient, il déplacera le nœud actuellement visité à la fin de la liste liée. Lentement, le nœud principal sera l'élément le moins visité.

Je suppose que tu aimes

Origine blog.csdn.net/Jgx1214/article/details/109096678
conseillé
Classement