Maison  >  Article  >  Java  >  Entretien avec SF Technology

Entretien avec SF Technology

Java后端技术全栈
Java后端技术全栈avant
2023-08-15 15:52:171243parcourir

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.

Regardez d'abord la question

  1. Présentez-vous
  2. Parlez-moi d'un projet que vous pensez être un défi
  3. Comment apprendre Java
  4. Parlez-moi sur les classes abstraites et interfaces
  5. Parlons de HashMap et Hashtable
  6. Le processus d'ajout d'un élément à HashMap
  7. Qu'est-ce qu'un arbre rouge-noir et quelles sont ses caractéristiques ?
  8. Les caractéristiques de l'arbre B+, combien de couches, combien de données peuvent être stockées au maximum
  9. Pourquoi l'index de MySQL utilise-t-il l'arborescence B+ au lieu de sauter la table ? MySQL的索引为什么使用B+树而不使用跳表?
  10. Redis
  11. RedisPourquoi utiliser les tables de saut Au lieu d'utiliser un arbre B+ ou un arbre binaire ?
  12. À quoi devez-vous faire attention lors de la création d'un index ?
  13. Si la quantité de données dans une seule table dépasse les dizaines de millions, comment l'optimiser ?
  14. Une table a avec 5 millions de données et une table b avec 3 millions de données sont liées via la clé étrangère tid Comment pouvons-nous interroger rapidement les 200 enregistrements de données de 50000 à 50200 qui remplissent les conditions ?
  15. Parlez du modèle de mémoire JVM
  16. Pourquoi avez-vous besoin de la zone Survivor ?
Avez-vous quelque chose à me demander ?

Analyse des questions du test

Présentez-vous

🎜🎜Réponse de la recrue :🎜

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.

Parlez-moi d'un projet qui vous paraît un défi

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.

Comment apprenez-vous habituellement Java

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.

Parlons des classes abstraites et des interfaces

  • Les classes abstraites doivent être héritées par les sous-classes, et les interfaces doivent être implémentées par les sous-classes.
  • Les classes abstraites peuvent avoir des constructeurs, mais les interfaces ne peuvent pas avoir de constructeurs.
  • Il peut y avoir des variables membres ordinaires dans les classes abstraites, mais il n'y a pas de variables membres ordinaires dans les interfaces. Ses variables ne peuvent être que des constantes statiques publiques
  • Une classe peut implémenter plusieurs interfaces, mais ne peut hériter que d'une seule classe parent. , cette classe parent peut être une classe abstraite.
  • Les déclarations de méthodes et les implémentations de méthodes peuvent être effectuées dans des classes abstraites. Les déclarations de méthodes peuvent être effectuées dans les interfaces et les méthodes par défaut peuvent également être définies.
  • Niveau d'abstraction (de haut en bas) : 接口>抽象类>实现类.
  • Les classes abstraites sont principalement utilisées pour abstraire des catégories, et les interfaces sont principalement utilisées pour abstraire les fonctions de méthode.
  • Le mot-clé de la classe abstraite est abstrait, et le mot-clé de l'interface est interface

Parlons de HashMap et de Hashtable

Nous pouvons répondre sous cinq aspects :

  1. 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) 

  2. 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 ;

  3. 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.

  4. 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()方法保证)。

  5. 底层数据结构:JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度度大于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

尽管是普通不能再普通的面试题了,可面试中,照样很大部分人同学回答的不好。回答中提到了2的n次幂,面试官很有可能会继续追问相关的问题,如果还不清楚的,建议对HashMap进行系统的学习。

我的博客上之前发过两篇文章:

HashMap添加一个元素的流程

HashMap

  • Bottom Structure des données : HashMap après JDK1.8 a subi des changements majeurs dans la résolution des conflits de hachage lorsque la longueur de la liste chaînée est supérieure au seuil (la valeur par défaut est 8) (elle sera jugée avant de convertir la liste chaînée en un arbre rouge-noir. . Si la longueur du tableau actuel est supérieure à 64, alors le tableau sera d'abord étendu au lieu d'être converti en une arborescence rouge-noir) et la liste chaînée sera convertie en une arborescence rouge-noir pour réduire le temps de recherche. Hashtable n'a pas un tel mécanisme. 🎜
  • 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 >

    HashMapLe processus d'ajout d'un élément

    HashMapLe 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éthode
    • 2 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 index 16KB/(4B+6B)≈1638个索引

    所以,两层的B+树可以存储:16*1638=26208条数据;三层的B+树可以存储:16*1638*1638=42928704条数据。

    MySQL的索引为什么使用B+树而不使用跳表?

    B+树是多叉树结构,每个结点都是一个16k的数据页,能存放较多索引信息,所以扇出很高三层左右就可以存储2kw

    Ainsi, un arbre B+ à deux couches peut stocker : 16*1638=26208 éléments de données ; l'arborescence B+ à trois couches peut stocker :