Maison > Java > JavaQuestions d'entretien > La semaine dernière, j'ai eu un entretien avec XX Insurance et c'était cool ! ! !

La semaine dernière, j'ai eu un entretien avec XX Insurance et c'était cool ! ! !

Libérer: 2023-08-25 15:44:19
avant
1489 Les gens l'ont consulté

La semaine dernière, un ami du groupe est allé passer un entretien avec Ping An Insurance. Le résultat a été un peu regrettable, ce qui est bien dommage, mais j'espère que vous ne vous découragerez pas. Comme vous l'avez dit, les questions rencontrées. dans l'interview, tout va bien. Vous l'avez résolu en lisant les questions au dos, alors faites de votre mieux !

De plus, si vous avez des questions, n'hésitez pas à venir vers moi pour discuter et progresser ensemble.

Sans aller trop loin, entrons dans le vif du sujet. Vous trouverez ci-dessous les questions d'entretien technique et les réponses de référence compilées par cet étudiant.

Quelles sont les classes thread-safe en Java ?

VectorHashtableStringBuffer. Ils ajoutent tous des verrous de synchronisation à leurs méthodes pour assurer la sécurité des threads.

De plus, il y a tous les cours de collecte dans le cadre du forfait JUC

ArrayBlockingQueue  、ConcurrentHashMapConcurrentLinkedQueueConcurrentLinkedDeque等,这些也是线程安全的。ArrayBlockingQueue 、ConcurrentHashMapConcurrentLinkedQueueConcurrentLinkedDeque等,这些也是线程安全的。

幸好这么回答就算结束了,面试官也没再问了,不然JUC下的这几个我真回答不上来。

Java创建对象有几种方式?

这个问题相对还是简单的,能说上个123应该都没问题了。

Java

Java创建对象有几种方式?

Java中提供了以下四种创建对象的方式 :🎜</p> <ul class="list-paddingleft-2" data-tool="mdnice编辑器" style='margin-top: 8px;margin-bottom: 8px;padding-left: 25px;width: 557.438px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;'> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">new crée un nouvel objet</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">via un mécanisme de réflexion</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">en utilisant le mécanisme de clonage</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">via un mécanisme de sérialisation</section></li> </ul> <h2 data-tool="mdnice编辑器" style='margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 1.3em;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-bottom: 2px solid rgb(239, 112, 96);'> <span style="margin-right: 3px;padding: 3px 10px 1px;display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);border-top-right-radius: 3px;border-top-left-radius: 3px;">Quelles sont les méthodes courantes d'Object ? </span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span> </h2> <blockquote data-tool="mdnice编辑器" style='margin-top: 20px;margin-bottom: 20px;padding: 10px 10px 10px 20px;border-left-color: rgb(239, 112, 96);color: rgb(106, 115, 125);font-size: 0.9em;text-align: left;white-space: normal;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-top: none;border-right: none;border-bottom: none;overflow: auto;background: rgb(255, 249, 249);'><p style="padding-top: 8px;padding-bottom: 8px;font-size: 16px;color: black;line-height: 26px;">La réponse à cette question n'était pas très bonne à cette époque, je me souvenais seulement deString, equals, hashCode, wait, notify et notifyAll. Je n'ai pensé à rien d'autre. L'intervieweur n'arrêtait pas de hocher la tête, donnant l'impression que tout devrait bien se passer. </p></blockquote> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>java.lang.Object</p> <figure data-tool="mdnice编辑器" style='margin-top: 10px;margin-bottom: 10px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;display: flex;flex-direction: column;justify-content: center;align-items: center;'><p style="padding-right: 0.5em;padding-left: 0.5em;text-align: center;"><img src="https://img.php.cn/upload/article/001/273/727/b03453560f8cab061b6e32f9f0f63939-0.png" alt="La semaine dernière, j'ai eu un entretien avec XX Insurance et c'était cool ! ! !" ></p></figure><p data-tool="mdnice编辑器" style="max-width:90%"PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Voici la signification de la méthode correspondante. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>méthode clone</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'> méthode protégée pour implémenter une copie superficielle de l'objet. Cette méthode ne peut être appelée que si l'interface Cloneable est implémentée, sinon une exception CloneNotSupportedException sera levée pour implémenter Cloneable et son membre. les variables sont des types de référence. Vous devez implémenter Cloneable, puis remplacer la méthode clone. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>méthode finalize</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Cette méthode est liée au garbage collector. La dernière étape pour déterminer si un objet peut être recyclé est de déterminer si cette méthode a été remplacée. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>méthode égale</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Cette méthode est utilisée très fréquemment. Généralement, égal et == sont différents, mais dans Objet, ils sont identiques. Les sous-classes remplacent généralement cette méthode. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>Méthode hashCode</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Cette méthode est utilisée pour la recherche de hachage. Le remplacement de la méthode equals nécessite généralement de réécrire la méthode hashCode. Cette méthode est utilisée dans certaines collections avec des fonctions de hachage. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'> Doit généralement satisfaire <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>obj1.equals(obj2)==true。可以推出 obj1.hashCode()==obj2.hashCode(), mais un hashCode égal ne satisfait pas nécessairement des égaux. Cependant, afin d'améliorer l'efficacité, les deux conditions ci-dessus doivent être rendues aussi équivalentes que possible.

  • JDK 1.6 et 1.7 renvoient par défaut un nombre aléatoire ;
  • JDK 1.8 renvoie par défaut un nombre aléatoire lié au fil de discussion actuel + trois certaines valeurs, en utilisant l'algorithme de nombres aléatoires du schéma xorshift de Marsaglia pour obtenir un nombre aléatoire.

wait method

est utilisée avec synchronisé. La méthode wait fait attendre le thread actuel pour le verrouillage de l'objet. Le thread actuel doit être le propriétaire de l'objet, c'est-à-dire qu'il a le verrou de l'objet. objet. La méthode wait() attend jusqu'à ce qu'elle acquière le verrou ou soit interrompue. wait(long timeout) définit un intervalle de délai d'attente et revient si le verrou n'est pas obtenu dans le délai spécifié.

Après avoir appelé cette méthode, le thread actuel entre en état de veille jusqu'à ce que les événements suivants se produisent.

  1. D'autres threads ont appelé la méthode notify de l'objet ;
  2. D'autres threads ont appelé la méthode notifyAll de l'objet ;
  3. D'autres threads ont appelé interrompu pour interrompre le thread
  4. L'intervalle de temps est écoulé ; .

À ce moment, le fil peut être planifié s'il est interrompu, une InterruptedException sera levée. La

méthode notify

est utilisée conjointement avec synchronisé. Cette méthode réveille un thread dans la file d'attente sur l'objet (les threads dans la file d'attente de synchronisation sont destinés aux threads qui préemptent le CPU et aux threads en attente). la file d'attente fait référence au thread réveillé en attente).

La méthode

notifyAll

est utilisée avec synchronisé. Cette méthode réveille tous les threads en attente dans la file d'attente sur cet objet.

Quelle est la relation entre la méthode hashCode et la méthode equals

C'est un peu une attaque en série Quand j'ai posé cette question, j'ai senti que l'intervieweur doutait de mon fondement, mais cette question peut quand même. être répondu.

Si a.equals(b) renvoie "true", alors le hashCode() doit être égal. hashCode()必须相等。

如果a.equals(b)返回“false”,那么a和b的hashCode()

Si a.equals(b) renvoie "false", alors le hashCode() peut être égal ou différent. 🎜

Le rôle du hashcode

C'est vraiment une série de questions, les unes après les autres, les réponses ne sont pas idéales, mais elles sont aussi pertinentes.

Java a deux types de collections , un type est List et l’autre type est Set. Le premier est ordonné et répétable, tandis que le second est désordonné et non répétable. Comment déterminer si l'élément existe déjà lorsqu'on l'insère dans l'ensemble ? On peut utiliser la méthode equals. Mais s’il y a trop d’éléments, cette méthode sera plus complète. Java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较满。

于是有人发明了哈希算法来提高集合中查找元素的效率。这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。

hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode

Alors quelqu'un a inventé l'algorithme de hachage pour améliorer l'efficacité de la recherche d'éléments dans la collection. Cette méthode divise la collection en plusieurs zones de stockage. Un code de hachage peut être calculé pour chaque objet. Les codes de hachage peuvent être regroupés à une certaine zone de stockage. L'objet peut être déterminé en fonction du code de hachage d'un objet. La zone où il doit être stocké. 🎜🎜hashCode peut être compris comme ceci : it Ce qui est renvoyé est une valeur calculée en fonction de l'adresse mémoire de l'objet. De cette façon, lorsqu'un nouvel élément est ajouté à la collection, le hashCode peut localiser instantanément l'emplacement physique où il doit être placé. S'il n'y a aucun élément à cette position, il peut être stocké directement à cette position sans aucune comparaison ; s'il y a déjà un élément à cette position, appelez sa méthode égale pour comparer avec le nouvel élément. S'ils sont identiques, ils le seront. ne pas être stocké, s'il n'est pas le même, hacher d'autres adresses. De cette façon, le nombre d’appels réels à la méthode equals est considérablement réduit, presque une ou deux fois seulement. 🎜

Parlons du principe d'assemblage automatique de Spring Boot

Cette question est aussi parce qu'elle est écrite sur mon CVSpring Boot,所以被问到也是正常的,不过我面试前还是看过一些,回答的还行,面试官说差不多是这个意思。

在Spring Boot中有个很关键的注解@SpringBootApplication ,其中这个注解又可以等同于

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

@EnableAutoConfiguration est la clé (activer configuration automatique), charge en interne META-INF/spring. usines, puis filtrez les informations avec EnableAutoConfiguration sont les données clés et sont chargées dans le conteneur IOC pour réaliser la fonction de configuration automatique ! @EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!

数据库事务的隔离级别有哪些?

这种问题,背背八股文,网上一堆堆。

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committedRepeatable readSerializable

Quels sont les niveaux d'isolement des transactions de base de données ?

Pour ce genre de question, mémorisez les huit- essai à pattes, il y en a beaucoup en ligne.

🎜Il existe 4 niveaux d'isolement pour les transactions de base de données, de faible à élevé : Lire non validéLecture répétable code >, <code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05 ) ;famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>Sérialisable. 🎜
  • Lecture non validée(LIRE UNCOMMITTED ) : Sous ce niveau d'isolement, d'autres transactions peuvent voir les modifications non validées de cette transaction, ce qui entraînera des problèmes de lecture sale (les parties non validées des autres transactions sont lues, puis la transaction est annulée READ UNCOMMITTED):这个隔离级别下,其他事务可以看到本事务没有提交的部分修改,因此会造成脏读的问题(读取到了其他事务未提交的部分,而之后该事务进行了回滚);
  • 已提交读(READ COMMITTED):其他事务只能读取到本事务已经提交的部分,这个隔离级别有不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟然不一样,因为另外一个事务对数据进行了修改;"
  • 可重复读(REPEATABLE READ)。可重复读隔离级别解决了上面不可重复读的问题,但是仍然有一个新问题,就是幻读。当你读取id> 10 的数据行时,对涉及到的所有行加上了读锁,此时例外一个事务新插入了一条id=11的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11的数据,而上次的查询操作并没有获取到,再进行插入就会有主键冲突的问题;
  • 可串行化(SERIALIZABLE
Soumise pour lecture (); READ COMMITTED) : Les autres transactions ne peuvent que lire la partie soumise de cette transaction. Ce niveau d'isolement a le problème de lecture non répétable. Les résultats obtenus après deux lectures dans la même transaction sont en fait différents, car une autre transaction modifie les données "

Repeatable Read(. LECTURE RÉPÉTABLE). Le niveau d'isolement de lecture répétable résout le problème de lecture non répétable ci-dessus, mais il existe toujours un nouveau problème, à savoir la lecture fantôme. Lorsque vous lisez la ligne de données avec id>10, un verrou de lecture est ajouté à toutes les lignes impliquées. À ce stade, une transaction insère une nouvelle donnée avec id=11. Parce qu'elle est nouvellement insérée, ce qui précède ne le sera pas. déclenché. Si le verrou est exclusif, alors lorsque vous effectuerez la prochaine requête de cette transaction, vous trouverez une donnée avec l'identifiant = 11, mais la dernière opération de requête ne l'a pas obtenue. Si vous l'insérez à nouveau, il y en aura. un problème de conflit de clé primaire ; rgba(27, 31, 35, 0.05);famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace;saut de mot : break-all;couleur : rgb(239, 112, 96);">SERIALIZABLE

). Il s'agit du niveau d'isolement le plus élevé, qui peut résoudre tous les problèmes mentionnés ci-dessus, car il force toutes les opérations à être exécutées en série, ce qui entraînera une chute rapide des performances de concurrence, il n'est donc pas très couramment utilisé.

Parlez-moi de votre compréhension des index dans MySQL🎜🎜🎜🎜🎜🎜Cette question, d'accord, dites-moi autant que vous en savez. À en juger par la préparation de chacun, j'étais plutôt bien préparé. J'ai l'impression que ma réponse est plutôt bonne, j'ai donc répondu ensemble aux avantages et aux inconvénients de l'index. 🎜

Index est une structure de données qui permet à Mysql d'obtenir efficacement des données. Pour le dire plus généralement, un index de base de données est comme la table des matières au début d'un livre, ce qui peut accélérer les requêtes dans la base de données.

Avantages

  • Peut garantir l'unicité de chaque ligne de données dans la table de base de données
  • Peut accélérer considérablement la vitesse d'indexation des données
  • Accélérer la connexion entre les tables, en particulier lors de la mise en œuvre de la référence de données. particulièrement significatif en termes d'exhaustivité
  • Lors de l'utilisation de clauses de regroupement et de tri pour la récupération de données, cela peut également réduire considérablement le temps de regroupement et de tri dans les requêtes
  • En utilisant des index, pendant le processus de requête temporelle, utilisez des caches d'optimisation pour améliorer les performances du système

Inconvénients

  • La création et la maintenance des index prennent du temps, ce qui augmente avec la quantité de données
  • Les index doivent occuper de l'espace physique, en plus des données En plus de l'espace de données occupé par la table, chaque index occupe également une certaine quantité d'espace physique. Si un index clusterisé doit être établi, l'espace requis sera plus grand
  • Lors de l'ajout, de la suppression ou de la modification de données dans la table, l'index doit également être maintenu dynamiquement, ce qui réduit la vitesse de maintenance des entiers

Quelles méthodes d'optimisation SQL connaissez-vous ?

Cette partie a été apprise en lisant "Connaissances essentielles des bases de données MySQL pour les programmeurs Java" dans Knowledge Planet de Brother Tian. Je n'en ai parlé qu'en partie parce que frère Tian a compilé beaucoup de choses. Je suis désolé, mon frère a une mauvaise mémoire. bien.

1. N'utilisez pas select *

2 Essayez de réduire les sous-requêtes et utilisez plutôt les requêtes associées (jointure gauche, jointure droite, jointure interne)

3. Réduisez l'utilisation de IN ou NOT IN, utilisez existe, n'existe pas. Ou remplacez l'instruction de requête associée

4. Essayez d'utiliser union ou union all au lieu de ou query (union all sera meilleure lorsqu'il sera confirmé qu'il n'y a pas de données en double ou qu'il n'est pas nécessaire d'éliminer les données en double)

5. . Essayez d'éviter de l'utiliser dans la clause Where. Utilisez l'opérateur != ou <>, sinon le moteur abandonnera l'utilisation de l'index et effectuera une analyse complète de la table.

6. Essayez d'éviter de porter des jugements de valeur nulle sur les champs de la clause Where, sinon le moteur abandonnera l'utilisation de l'index et effectuera une analyse complète de la table, telle que : sélectionnez l'identifiant à partir de t où num est nul. Vous pouvez définir la valeur par défaut. valeur 0 sur num , assurez-vous qu'il n'y a pas de valeur nulle dans la colonne num du tableau, puis interrogez comme ceci : sélectionnez l'identifiant à partir de t où num=0

Comment une requête SQL est-elle exécutée dans MySQL ?

NND, j'aime tellement poser des questions sur MySQL, cette question m'a vraiment dérouté, l'intervieweur est devenu un peu impatient après avoir dit des bêtises. Quand je suis revenu, je suis allé sur Knowledge Planet de Tian Ge et je l'ai parcouru. Effectivement, c'était encore presque la même question d'entretien, je me suis reproché de ne pas être prêt.

Par exemple, l'instruction SQL suivante (donnée par l'intervieweur sur placeSQL) :

select 字段1,字段2 from 表 where id=996
Copier après la connexion
  1. Obtenez le lien et utilisez le connecteur dans MySQL.
  2. Cache de requête, la clé est l'instruction SQL, la valeur est le résultat de la requête, si elle est trouvée, elle sera renvoyée directement. Il n'est pas recommandé d'utiliser le cache secondaire. Le cache de requêtes a été supprimé dans la version MySQL 8.0, ce qui signifie que cette fonction n'existe plus après la version MySQL 8.0.
  3. Analyzer, divisé en analyse lexicale et analyse syntaxique. Cette étape effectue simplement une analyse SQL et une vérification de la syntaxe. Les erreurs grammaticales générales se trouvent donc à ce stade.
  4. Optimizer détermine quel index utiliser lorsqu'il y a plusieurs index dans la table ou lorsqu'il y a une association multi-tables (jointure) dans une instruction, il détermine l'ordre de connexion de chaque table.
  5. Exécuteur, indiquez à SQL ce que vous voulez faire via l'analyseur, sachez quoi faire via l'optimiseur, puis commencez à exécuter l'instruction. Lors de l'exécution de l'instruction, vous devez également déterminer si vous disposez de cette autorisation. Si vous n'avez pas l'autorisation, vous renverrez directement une erreur indiquant que vous n'avez pas l'autorisation, ouvrez la table et utilisez l'interface. fourni par le moteur pour obtenir la première ligne du tableau selon la définition du moteur du tableau, déterminez si l'identifiant est égal à 1. Si c'est le cas, revenez directement ; s'il ne continue pas à appeler l'interface du moteur pour passer à la ligne suivante, répétez le même jugement jusqu'à ce que la dernière ligne du tableau soit récupérée, et enfin revenez.

Je me demandais, que signifie 996, votre entreprise est-elle 996 ? Dis-le simplement avec désinvolture

Quelle est la différence entre tas et pile dans JVM ?

Ce n'est pas mal, je peux y répondre si je connais un peu la JVM. L'explication de la zone de données d'exécution JVM compilée par Brother Tian est très intéressante.

La différence essentielle entre les deux : la stack est privée au thread, tandis que le tas est partagé par le thread.

Stack est une unité d'exécution, représentant la logique. Une pile correspond à un thread, contenant des types de données de base et des références d'objet dans le tas. La zone est continue et n'a pas de fragments.

Heap est une unité de stockage, représentant des données. peut être partagé par plusieurs piles (y compris les types de données de base, les références et les objets de référence dans les membres), la zone n'est pas continue et il y aura des fragments.

1) Différentes fonctions

La mémoire pile est utilisée pour stocker les variables locales et les appels de méthode, tandis que la mémoire tas est utilisée pour stocker les objets en Java. Qu'il s'agisse de variables membres, de variables locales ou de variables de classe, les objets vers lesquels elles pointent sont stockés dans la mémoire tas.

2), partage différent

La mémoire de la pile est privée aux threads. La mémoire tas est commune à tous les threads.

3), les erreurs d'exception sont différentes

Si la mémoire de pile ou la mémoire de tas est insuffisante, une exception sera levée.

Espace de pile insuffisant : java.lang.StackOverFlowError.

Espace de tas insuffisant : java.lang.OutOfMemoryError.

4), taille de l'espace

La taille de l'espace de la pile est beaucoup plus petite que celle du tas.

Connaissez-vous le mécanisme de chargement des classes ?

Ce ne sont que des questions d'entretien consécutives

Le chargement de la classe JVM est divisé en 5 processus : chargement, vérification, préparation, analyse, initialisation, utilisation, désinstallation, comme le montre la figure ci-dessous :

La semaine dernière, j'ai eu un entretien avec XX Insurance et c'était cool ! ! !

Jetons un coup d'œil aux actions spécifiques des cinq processus de chargement, de vérification, de préparation, d'analyse et d'initialisation.

Chargement

Le chargement consiste principalement à lire le flux d'octets binaires dans le fichier .class (pas nécessairement .class. Il peut s'agir d'un package ZIP, obtenu à partir du réseau) dans la JVM. Pendant la phase de chargement, la JVM doit effectuer trois choses : 1) Obtenir le flux d'octets binaires de la classe via le nom complet de la classe 2) Convertir la structure de stockage statique représentée par le flux d'octets en structure de données d'exécution de ; la zone méthode ; 3) Générer un objet java.lang.Class de cette classe en mémoire comme entrée d'accès à diverses données de cette classe dans la zone méthode.

Connexion

Vérification

La vérification est la première étape de la phase de connexion, garantissant principalement que le flux d'octets chargé est conforme aux spécifications JVM. La phase de vérification complétera les quatre étapes d'actions de vérification suivantes : 1) Vérification du format de fichier 2) Vérification des métadonnées (si elles sont conformes à la spécification du langage Java) 3) Vérification du bytecode (pour confirmer que la sémantique du programme est légale et logique) 4) Vérification de la référence du symbole (assurez-vous que la prochaine étape de l'analyse peut être exécutée normalement)

Préparation

Allouez principalement de la mémoire pour les variables statiques dans la zone de méthode et définissez la valeur initiale par défaut.

Résolution

est le processus par lequel la machine virtuelle remplace les références de symboles dans le pool constant par des références directes.

Initialisation

La phase d'initialisation est la dernière étape du processus de chargement de classe. Elle attribue principalement activement des valeurs aux variables de classe en fonction des instructions d'affectation du programme. Remarque : 1) Lorsqu'il existe une classe parent et que la classe parent est initialisée, initialisez d'abord la classe parent. 2) Effectuez ensuite l'instruction d'initialisation de la sous-classe ;

Quelles sont les conditions qui peuvent déclencher le Full GC ?

C'est un peu nerveux. Je pensais poser des questions sur les algorithmes de collecte des ordures, etc., mais j'ai fini par poser la question ici. Je n'étais pas prêt pour ça, alors j'ai juste dit deux choses avec désinvolture, et j'ai évidemment senti que l'intervieweur était très insatisfait. Hé, ça y est, retournez et préparez-vous bien.

Habituellement, il existe cinq scénarios qui déclenchent le Full GC :

(1) Appel System.gc时,系统建议执行Full GC, mais il n'est pas nécessairement exécuté

(2) Espace insuffisant dans l'ancienne génération

(3) Méthode pour supprimer l'espace insuffisant

(4) Taille moyenne de l'ancienne génération après avoir réussi le Minor GC > Mémoire disponible de l'ancienne génération

(5) Lors de la copie depuis la zone Eden, de la zone Espace vers la zone Vers l'espace, la taille de l'objet est plus grande que la mémoire disponible de To Space, puis l'objet est transféré vers l'ancienne génération, et la mémoire disponible de l'ancienne génération est plus petit que la taille de l'objet. Autrement dit, lorsque l'ancienne génération ne peut pas stocker d'objets de la nouvelle génération vers l'ancienne génération, Full GC sera déclenché.

Le processeur du système en ligne est si élevé, que dois-je faire ?

La réponse à cette question n'est pas très satisfaisante. Je sais que frère Tian a compilé un document, mais je ne l'ai pas encore vu après l'avoir lu sur le chemin du retour, j'ai découvert que cela pouvait aussi l'être. Question mémorisée pour les entretiens, je n'y ai pas répondu. Retournez et travaillez plus dur. L'intervieweur est venu et a dit : OK, notre entretien se terminera ici aujourd'hui, je ferai rapport aux RH ici. Vous attendez ici.

Au bout d'un moment, la belle RH est arrivée avec le sourire (je pensais que le problème n'était pas grave), mais il s'est avéré...

Vous êtes "YY, l'intervieweur a donné son avis sur la situation de l'entretien. Nous l'examinerons en détail. Vous revenez d'abord. Nous vous appellerons pour vous informer des résultats plus tard."

(⊙o⊙)..., plus de n jours se sont écoulés, et il n'y avait aucune nouvelle. C'était vraiment cool.

L'opération normale est la suivante :

1. top oder by with P : 1040 // Tout d'abord, triez par charge de processus pour trouver axLoad(pid)

2. top -Hp process PID : 1073 // Trouvez la charge appropriée. thread PID

3. printf "0x%xn" Thread PID : 0x431 // Convertit le thread PID en hexadécimal pour préparer la recherche ultérieure dans le journal jstack

4. jstack process PID | vim +/hex thread PID - // Par exemple : jstack 1040|vim +/0x431 -

Résumé

L'ensemble du processus d'entretien a été relativement simple et l'intervieweur était également gentil C'est plutôt bien, je me reproche juste de ne pas être préparé. En tant que personne qui travaille depuis deux ans, je n'ai jamais vu certaines questions. Cependant, les questions posées par l'intervieweur semblent préparées (mémorisez les questions de l'entretien). , et cela ne doit pas nécessairement être fait en personne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:Java后端技术全栈
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal