J'avais initialement prévu un entretien à 15 heures, mais l'intervieweur s'est connecté plus tôt et m'a vu en ligne et m'a dit de commencer tôt.
Pourquoi l'index de MySQL
utilise-t-il l'arborescence B+ au lieu de sauter la table ? MySQL
的索引为什么使用B+树而不使用跳表?Redis
Redis
Pourquoi utiliser les tables de saut Au lieu d'utiliser un arbre B+ ou un arbre binaire ?
Bonjour l'intervieweur, je m'appelle Zhang San, je viens du Henan. Je suis diplômé de l'Université XX. Je suis engagé dans le développement Java depuis l'obtention de mon diplôme à XX, presque. Cela fait 3 ans. Venez dans votre entreprise pour un entretien et recherchez un emploi de développement Java.
Quelques points pour vous présenter : Qui êtes-vous et quels sont vos points forts ? Qu'as-tu fait toutes ces années ? Quelles récompenses avez-vous remportées à l’école ? Sur quelles technologies avez-vous mené des recherches approfondies ? Existe-t-il une conception pour un système hautement concurrent ? Avez-vous participé à des projets à grande échelle ?
En bref, montrez tous vos atouts et faites savoir aux autres dans quels domaines vous êtes relativement fort.
Cette question varie en fait d'une personne à l'autre. Pour un ami qui débute, lui demander de construire un projet peut sembler très difficile.
Pour Daniel, le « défi » n'est plus la technologie. De plus, comment emballer le projet pour convaincre le patron et comment presser ses subordonnés est le point difficile du projet.
Dans le processus d'entretien, « difficile » est un critère pour l'intervieweur. Si l'intervieweur n'a jamais été exposé aux aspects techniques du projet et que cela semble difficile, alors il s'agit d'un projet « difficile ».
Si l'intervieweur connaît le projet de défi que vous avez mentionné, cela peut être une opportunité et un défi pour vous en ce moment. Si vous pouvez répondre aux questions que l'intervieweur n'a pas rencontrées et comment vous les avez résolues, l'intervieweur le fera. soyez complètement impressionné. Vous, en revanche, si l'intervieweur connaît les questions sur ce projet et que vous ne pouvez pas y répondre, alors l'entretien sera grandement compromis.
Par exemple : il y a cinq ou six ans, vous aviez Dubbo et Spring Boot dans votre pile technologique, qui étaient très populaires, mais ils sont désormais standards.
Cependant, il existe encore peu de développeurs ayant une expérience dans le big data, la haute concurrence et la transformation de l'architecture, car la plupart des entreprises ne peuvent pas devenir de grandes entreprises. mais. C’est quelque chose qui ne peut pas être modifié, quelle que soit l’évolution du génie logiciel.
Les projets donc difficiles ont les caractéristiques suivantes :
1. Grand volume de données
2. Haute concurrence
3. Transformation de l'architecture
Tant que votre projet peut avoir un peu de ces choses, alors votre niveau de projet. sera d'au moins un niveau supérieur.
Ici, je vais vous donner un modèle de réponse :
1 Je suis responsable de ce projet d'entreprise xxx, et cette entreprise est pour xxx.
2. Afin de procéder rapidement par essais et erreurs et de répondre rapidement au marché, un plan xxxx simple a été utilisé au début.
3. Avec le développement des affaires, ce plan présente xxx problèmes techniques en xxx.
4. Afin de résoudre ces difficultés techniques, nous avons finalement utilisé la solution xxx, puis avons présenté ces solutions et comment ces solutions ont résolu ces problèmes techniques.
Dites simplement la vérité sur votre processus d'apprentissage, mais veillez à montrer que vous êtes actif dans l'apprentissage. De plus, marquez que vous avez une bonne habitude : prendre des notes, plusieurs. des fois, c'est pire qu'un mauvais stylo.
Il est recommandé de lire le site officiel, de lire des livres et de regarder des vidéos.
Dans le processus d'apprentissage, continuez à pratiquer, à réfléchir constamment et à résumer constamment.
接口>抽象类>实现类
. Nous pouvons répondre sous cinq aspects :
Le thread est-il sécurisé ? : HashMap n'est pas thread-safe, HashTable est thread-safe. Parce que les méthodes internes de HashTable sont essentiellement modifiées par synchronisation. (Si vous souhaitez garantir la sécurité des threads, utilisez ConcurrentHashMap)
Efficacité : en raison de problèmes de sécurité des threads, HashMap est légèrement plus efficace que HashTable ; De plus, HashTable est fondamentalement éliminé, ne l'utilisez pas dans votre code ;
Prise en charge de la clé Null et de la valeur Null : HashMap peut stocker des clés et des valeurs nulles, mais il ne peut y avoir qu'un seul null comme clé et null. en tant que valeur, il peut y en avoir plusieurs ; HashTable n'autorise pas les clés nulles et les valeurs nulles, sinon NullPointerException sera levée.
La différence entre la capacité initiale et l'extension de capacité à chaque fois :
① Si vous ne spécifiez pas de valeur de capacité initiale lors de sa création, la taille initiale par défaut de la table de hachage est de 11. Après chaque extension, la capacité devient la capacité d'origine 2n+1. La taille d'initialisation par défaut de HashMap est de 16. Chaque extension ultérieure doublera la capacité.
② Si la valeur initiale de capacité est donnée lors de la création, alors Hashtable utilisera directement la taille que vous avez donnée, et HashMap l'étendra à une puissance de 2 (tableSizeFor()
méthode garantie). tableSizeFor()
方法保证)。
底层数据结构:JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度度大于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
尽管是普通不能再普通的面试题了,可面试中,照样很大部分人同学回答的不好。回答中提到了2的n次幂,面试官很有可能会继续追问相关的问题,如果还不清楚的,建议对HashMap进行系统的学习。
我的博客上之前发过两篇文章:
HashMap
添加一个元素的流程
HashMap
Bien que cela est une question d'entretien extrêmement courante, mais lors de l'entretien, de nombreux étudiants n'y ont toujours pas bien répondu. La nième puissance de 2 est mentionnée dans la réponse. L'intervieweur est susceptible de continuer à poser des questions connexes. Si cela n'est toujours pas clair, il est recommandé d'étudier systématiquement HashMap. 🎜
J'ai déjà publié deux articles sur mon blog : 🎜 blockquote >
HashMap
Le processus d'ajout d'un élément
HashMap
Le processus d'ajout d'éléments en put peut être divisé en 9 étapes suivantes : 🎜
1. Lorsque vous utilisez la méthode put(), appelez directement la putVal()
méthode2 Lors de la mise, déterminez d'abord si le tableau est vide, et s'il est vide, effectuez une opération de redimensionnement 3. . Indexez le tableau avec un hachage La longueur -1 est associée à la valeur de hachage de la clé pour obtenir l'index dans le tableau. Si la position spécifiée par l'index est vide, cela signifie qu'il peut être inséré et qu'un nouveau nœud peut être inséré. directement 4. Déterminez la clé actuelle. Existe-t-elle ? Si elle existe, remplacez-la. Si le remplacement est réussi, renvoyez l'ancienne valeur 5. est un type d'arbre. S'il s'agit d'un type d'arbre, ajoutez-le en fonction de l'opération de l'arbre. Contenu du nouveau nœud 6 Si le nœud où le conflit de hachage se produit n'est pas un type d'arbre, cela signifie que la collision actuelle est. dans la liste chaînée, puis la logique de traitement de la boucle sera entrée à ce moment-là 7 Après avoir entré la logique de la boucle, déterminez d'abord ce qui est en cours de traitement. Vérifiez si le nœud suivant du nœud de collision est vide. vide, placez le nouveau nœud dans 8. Après l'avoir inséré, jugez si la liste chaînée actuelle dépasse la longueur maximale autorisée de la liste chaînée de 8. Si elle dépasse, elle sera convertie en un arbre rouge-noir pour l'insertion. 9. Si la table d'index de la carte est vide ou si la longueur actuelle de la table d'index est inférieure à 64 (la longueur maximale de la table du tableau d'index pour la conversion de l'arbre rouge-noir), alors effectuez simplement l'opération de redimensionnement sinon, si ; le nœud entré en collision n'est pas vide, puis ajoutez simplement le nœud et insérez-le le long de l'arborescence du nœud entré en collision Vous pouvez lire l'article de blog sur mon blog : Trois ans de code source essentiel de HashMap : http://www .woaijava.cc/blog/ 211
Qu'est-ce qu'un arbre rouge-noir et quelles sont ses caractéristiques ?
Red Black Tree est un arbre AVL spécialisé (arbre binaire équilibré). Il utilise des opérations spécifiques pour maintenir l'équilibre de l'arbre de recherche binaire lors des opérations d'insertion et de suppression, obtenant ainsi des performances de recherche plus élevées.
Il y a 5 caractéristiques des arbres rouge-noir :
Les nœuds sont rouges ou noirs.
Le nœud racine est noir.
Toutes les feuilles sont noires (les feuilles sont des nœuds NIL)
Les deux nœuds enfants de chaque nœud rouge sont noirs. (Il ne peut pas y avoir deux nœuds rouges consécutifs sur tous les chemins de chaque feuille à la racine)
Tous les chemins d'un nœud à chacune de ses feuilles contiennent le même nombre de nœuds noirs.
En fait, cette question n'est pas difficile. Ce qui est rare, c'est que certains intervieweurs peuvent poser des questions sur le fonctionnement des arbres rouge-noir, tournant à gauche et à droite... J'ai interviewé des centaines de personnes, et seulement une. peu de gens peuvent le dire.
Les caractéristiques de l'arbre B+, combien de couches, combien de données peuvent être stockées au maximum
Les caractéristiques de l'arbre B+ sont au nombre de deux :
1 nœuds non-feuilles] uniquement. avoir une fonction d'index, c'est-à-dire que les nœuds non-feuilles ne peuvent stocker que la clé, mais pas la valeur 2. Tous les nœuds feuilles de l'arborescence forment une liste chaînée ordonnée et toutes les données peuvent être parcourues dans l'ordre de tri des clés. . Les arbres B+ sont généralement à 1 voie et 3 couches.
Taille de la page InnoDBLa valeur par défaut est de 16 Ko :
Supposons que la taille d'un enregistrement est de 1 Ko, alors 16 éléments de données peuvent être stockés dans une page de données (en ignorant les autres structures de données de la page) Supposons que la clé primaire est int et que la taille du pointeur est de 6B, alors une page d'index peut stocker 16KB/(4B+6B)≈1638
index16KB/(4B+6B)≈1638
个索引所以,两层的B+树可以存储:
16*1638=26208
条数据;三层的B+树可以存储:16*1638*1638=42928704
条数据。
MySQL
的索引为什么使用B+树而不使用跳表?B+树是多叉树结构,每个结点都是一个16k的数据页,能存放较多索引信息,所以扇出很高。三层左右就可以存储
Ainsi, un arbre B+ à deux couches peut stocker :2kw
16*1638=26208
éléments de données ; l'arborescence B+ à trois couches peut stocker :