Maison  >  Article  >  Java  >  Résumé de quelques questions d'entretien Java classiques

Résumé de quelques questions d'entretien Java classiques

零下一度
零下一度original
2017-06-25 10:54:401007parcourir

Les entretiens sont quelque chose que chacun d'entre nous doit passer, la plupart d'entre nous plus d'une fois. Voici un résumé des dernières questions d'entretien de 2016, afin que chacun puisse obtenir deux fois le résultat avec moitié moins d'effort lors de la recherche d'un entretien. emploi.

1. Switch peut-il utiliser une chaîne comme paramètre ?

a. Avant Java 7, switch ne pouvait prendre en charge que byte, short, char, int ou leurs classes d'encapsulation et types Enum correspondants. Dans JAVA 7, la prise en charge des chaînes a été ajoutée.

2. La différence entre égal et == :

a.== consiste à déterminer si deux variables ou instances pointent vers le même espace mémoire est égal à déterminer quelles sont deux variables ou instances. pointez vers. Les valeurs de l'espace mémoire sont-elles les mêmes

3. Quelles sont les méthodes publiques d'Object ?

a. La méthode equals teste si deux objets sont égaux
b. La méthode clone copie l'objet
c La méthode getClass renvoie l'objet Class lié à l'objet actuel
d. Les méthodes notify, notifyall et wait sont toutes utilisées pour synchroniser les threads d'un objet donné

4. Les quatre types de références Java, fortes, faibles et faibles, et les scénarios utilisés

a. Utiliser des références logicielles et des références faibles pour résoudre le problème du MOO : utilisez un HashMap pour enregistrer la relation de mappage entre le chemin de l'image et la référence logicielle associée à l'objet image correspondant. Lorsque la mémoire est insuffisante, la JVM récupérera automatiquement l'espace. occupé par ces objets image mis en cache, évitant ainsi efficacement le problème du MOO
b. Implémentez le cache des objets Java via la méthode de récupération d'objets accessible en douceur : Par exemple, si nous créons une classe Employee, si nous devons interroger le informations d'un employé à chaque fois. Même si elle a été interrogée il y a seulement quelques secondes, une instance doit être reconstruite, ce qui prend beaucoup de temps. Nous pouvons combiner des références logicielles et HashMap. Tout d'abord, enregistrez la référence : référencez une instance de l'objet Employee sous la forme d'une référence logicielle et enregistrez la référence au HashMap. La clé est l'identifiant de l'employé et la valeur est la référence logicielle de. cet objet. , en revanche, consiste à supprimer la référence et à voir s'il existe une référence logicielle à l'instance Employee dans le cache. Si c'est le cas, récupérez-la à partir de la référence logicielle. S'il n'y a pas de référence logicielle ou si l'instance obtenue à partir de la référence logicielle est nulle, reconstruisez une instance et enregistrez la référence logicielle dans l'instance nouvellement créée
c Référence forte : si un objet a une référence forte, il ne le fera pas. être recyclage des éboueurs. Même si l'espace mémoire actuel est insuffisant, la JVM ne le récupérera pas, mais générera une erreur OutOfMemoryError, provoquant la fin anormale du programme. Si vous souhaitez rompre l'association entre une référence forte et un objet, vous pouvez attribuer explicitement la référence à null, afin que la JVM recycle l'objet au moment approprié
référence douce : lors de l'utilisation de soft lors du référencement, s'il y a suffisamment d'espace mémoire, la référence logicielle peut continuer à être utilisée sans être recyclée par le garbage collector. Ce n'est que lorsque la mémoire est insuffisante que la référence logicielle sera recyclée par le garbage collector.
e. Référence faible : les objets avec des références faibles ont un cycle de vie plus court. Parce que lorsque la JVM effectue un garbage collection, une fois qu'un objet de référence faible est trouvé, la référence faible sera recyclée, que l'espace mémoire actuel soit suffisant ou non. Cependant, comme le garbage collector est un thread de faible priorité, il peut ne pas être en mesure de trouver rapidement les objets de référence faibles
f Référence virtuelle : comme son nom l'indique, c'est uniquement le nom si un objet ne contient qu'un virtuel. référence, alors cela équivaut à Sans référence, il peut être collecté par le ramasse-miettes à tout moment.
g. Scénarios d'utilisation :

5. Quelle est la différence entre Hashcode et égal ?

a. et Il existe deux types d'ensembles. Parmi eux, set ne permet pas d'implémenter les éléments à plusieurs reprises. Cette méthode ne permet pas une implémentation répétée. Si vous utilisez égal pour comparer, s'il y a 1000 éléments et que vous créez un nouvel élément, vous en avez besoin. appeler égaux 1000 fois pour les comparer un par un. Comparer avec eux s'il s'agit du même objet réduira considérablement l'efficacité. Le hashcode renvoie en fait l'adresse de stockage de l'objet. S'il n'y a aucun élément à cette position, l'élément est stocké directement au-dessus de lui. Si un élément existe déjà à cette position, la méthode égale est appelée à ce moment pour comparer avec le nouveau. S'ils sont identiques, ils ne seront pas enregistrés et hachés vers d'autres adresses

6 La différence entre String, StringBuffer et StringBuilder

a. Le type StringBuffer est en fait que String est un objet immuable
b.StringBuffer et StringBuilder sont implémentés par des tableaux char[] au niveau de la couche inférieure
c.StringBuffer est thread-safe, tandis que StringBuilder est thread-unsafe

7. Distinguer les significations de Override et Overload

a.La surcharge, comme son nom l'indique, est un rechargement. Il peut exprimer le polymorphisme d'une classe. Il se peut que la fonction ait le même nom de fonction. mais le nom du paramètre, la valeur de retour et le type ne peuvent pas être les mêmes ; ou cela peut modifier les paramètres, le type, la valeur de retour mais le nom de la fonction reste inchangé.
b. Cela signifie ride (réécriture). Lorsque la sous-classe hérite de la classe parent, la sous-classe peut définir une méthode avec le même nom et les mêmes paramètres que sa classe parent, lorsque la sous-classe appelle cette fonction, elle sera automatiquement appelée. Méthodes des sous-classes, tandis que les classes parents sont équivalentes à être remplacées (remplacées).

8. La différence entre les classes abstraites et les interfaces

a. Une classe ne peut hériter que d'une seule classe, mais peut implémenter plusieurs interfaces
b. tandis que les classes d'abstractions mettent l'accent sur les relations de propriété
c.Toutes les méthodes des classes abstraites ne doivent pas nécessairement être abstraites. Vous pouvez choisir d'implémenter certaines méthodes de base dans les classes abstraites. L'interface exige que toutes les méthodes soient abstraites

9. Principes et caractéristiques de plusieurs méthodes d'analyse XML : DOM, SAX, PULL

a.DOM : consommation de mémoire : lisez d'abord tous les documents XML dans la mémoire, puis utilisez l'API DOM Accédez au structure arborescente et obtenir des données. C'est très simple à écrire, mais cela consomme beaucoup de mémoire. Si les données sont trop volumineuses et que le téléphone n'est pas assez puissant, le téléphone peut se bloquer directement
b.SAX : efficacité d'analyse élevée, faible utilisation de la mémoire, piloté par les événements : en termes plus simples, il analyse séquentiellement le document lorsque le. Le document est numérisé (la fonction de traitement des événements est notifiée lorsque le début et la fin du document, le début et la fin de l'élément, la fin du document, etc., et la fonction de traitement des événements prend les actions correspondantes, puis continue la même analyse jusqu'à ce que le document soit numérisé. fin du document.
c.SAX : Semblable à SAX, il est également piloté par les événements. Nous pouvons appeler sa méthode next() pour obtenir le prochain événement d'analyse (c'est-à-dire le document de début, le document de fin, la balise de début, la balise de fin). à un certain moment Lorsqu'il y a un élément, vous pouvez appeler la méthode getAttributte() de XmlPullParser pour obtenir la valeur de l'attribut, ou vous pouvez appeler son nextText() pour obtenir la valeur de ce nœud.

10. La différence entre wait() et sleep()

sleep vient de la classe Thread, et wait vient de la classe Object
Pendant le processus d'appel de sleep() méthode, le thread ne libérera pas le verrouillage de l'objet. Le thread qui appelle la méthode wait libérera le verrouillage de l'objet
Le sommeil n'abandonne pas les ressources système après le sommeil. Wait abandonne les ressources système et d'autres threads peuvent occuper le processeur
le sommeil (millisecondes) doit spécifier un temps de sommeil. , et il se réveillera automatiquement lorsque le temps sera écoulé

11 La différence entre le tas et la pile en JAVA, parlons du mécanisme de mémoire de Java

a. les références sont allouées sur la pile
b. La mémoire tas est utilisée pour stocker les objets et les tableaux créés par les nouvelles
variables de classe (variables modifiées par statique). Lorsque le programme est chargé, la mémoire est allouée aux variables de classe. le tas, et l'adresse mémoire dans le tas est stockée dans la pile.
d. Variables d'instance : lorsque vous utilisez le mot-clé java new, le système alloue un espace continu aux variables dans le tas, qui est converti en une longue longueur. via un algorithme de hachage basé sur des adresses de mémoire de tas dispersées. Une chaîne de nombres pour représenter "l'emplacement physique" de cette variable dans le tas, le cycle de vie de la variable d'instance - lorsque la référence à la variable d'instance est perdue, elle le sera. inclus dans la "liste" recyclable par le GC (garbage collector), mais ce n'est pas Libérez immédiatement la mémoire dans le tas
e. Variables locales : Déclarées dans une certaine méthode ou un certain segment de code (comme une boucle for). ), la mémoire est allouée sur la pile lors de son exécution. Une fois la variable locale hors de portée, la mémoire est immédiatement libérée

12Principe de mise en œuvre du polymorphisme JAVA

a. , le polymorphisme signifie que le même message peut utiliser plusieurs méthodes différentes en fonction du comportement de l'objet d'envoi. (L'envoi d'un message est un appel de fonction)
b.Le principe d'implémentation est la liaison dynamique.La méthode appelée par le programme est liée dynamiquement pendant l'exécution.Le traçage du code source permet à la JVM de trouver la méthode appropriée par transformation automatique. paramètres.

13. Mécanisme de récupération de place JAVA

a. Marquer la méthode de recyclage : parcourir le graphique d'objets et enregistrer les objets inaccessibles. Généralement, un seul thread est utilisé et la mémoire peut être utilisée. Fragmentation générée
b. Méthode de recyclage par compression de marque : L'étape initiale est la même que la première méthode, avec juste une étape supplémentaire, compressant tous les objets survivants à une extrémité de la mémoire, afin que les fragments de mémoire puissent être synthétisés dans une grande zone de mémoire réutilisable, améliorant l'utilisation de la mémoire
c. Méthode de recyclage de copie : divisez l'espace mémoire existant en deux parties, puis copiez les objets accessibles dans l'autre moitié de l'espace. efface tous les objets dans l'espace utilisé. Cette méthode convient aux objets à courte durée de vie. La copie continue d'objets à longue durée de vie entraînera une efficacité réduite.
d. Recyclage générationnel : Divisez l'espace mémoire en deux ou plusieurs domaines, tels que la jeune génération et l'ancienne génération. La caractéristique de la jeune génération est que les objets seront recyclés rapidement, donc l'efficacité d'utilisation chez la jeune génération. est un algorithme relativement élevé. Lorsqu'un objet survit encore après plusieurs recyclages, l'objet sera placé dans l'espace mémoire appelé ancienne génération, et l'ancienne génération adopte l'algorithme de compression de marque
e. Comptage de références (la méthode la plus simple et la plus ancienne) : fait référence à. la ressource Le processus de sauvegarde du nombre de références (peut être un objet, de la mémoire ou de l'espace disque, etc.) et de sa libération lorsque le nombre de références devient zéro
f. Traversée de référence d'objet (la méthode utilisée par la plupart des JVM maintenant). ) : Le parcours de référence d'objet commence à partir d'un ensemble d'objets et détermine de manière récursive les objets accessibles le long de chaque lien sur l'ensemble du graphe d'objets. Si un objet n'est pas accessible depuis un (au moins un) de ces objets racine, il est collecté comme garbage
g. Qu'est-ce qu'un garbage collector : libère de la mémoire pour les objets qui ne contiennent plus de références
h. si un objet doit être collecté ?
i. Plusieurs mécanismes de collecte des déchets

14. Combien de types de collectes existe-t-il en Java et quelles sont les différences ?

a.HashTable est plus ancien et est implémenté sur la base de la classe Dictionary, tandis que HashTable est implémenté sur la base de l'interface Map
b.HashTable est thread-safe, tandis que HashMap est thread-unsafe
c.HashMap peut make Vous utilisez une valeur nulle comme clé ou valeur d'une entrée de table
d. La différence entre ArrayList, LinkedList et Vector : la couche inférieure de ArrayList et Vector utilise des tableaux pour stocker les données. Vector utilise la méthode synchronisée (thread. sécurité), donc ses performances sont meilleures. Pire qu'ArrayList, LinkedList utilise une liste doublement chaînée pour le stockage et l'accès aléatoire est plus lent
e L'implémentation du code source sous-jacent de HashMap : lorsque nous mettons des éléments dans HashMap, nous recalculons d'abord le. valeur de hachage basée sur le hashCode de la clé. Cela vaut la peine d'obtenir la position (c'est-à-dire l'indice) de cet élément dans le tableau. S'il y a d'autres éléments stockés à cette position dans le tableau, alors les éléments à cette position seront stockés dans. sous la forme d'une liste chaînée, et les nouveaux ajoutés seront placés en tête de la chaîne. Celui ajouté en premier est placé à la fin de la chaîne. S'il n'y a aucun élément à cette position dans le tableau, l'élément est directement placé à cette position dans le tableau.
Mécanisme f.Fail-Fast : si d'autres threads modifient la carte lors de l'utilisation de l'itérateur, ConcurrentModificationException sera levée. Il s'agit du mécanisme dit d'échec rapide. Ce mécanisme est implémenté dans le code source via le champ modCount, comme son nom l'indique, c'est le nombre de modifications apportées au contenu de HashMap qui augmentera cette valeur. Ensuite, cette valeur sera attribuée au ModCount attendu de l'itérateur. processus d’initialisation de l’itérateur. Pendant le processus d'itération, déterminez si modCount et ExpectedModCount sont égaux. S'ils ne sont pas égaux, cela signifie que d'autres threads ont modifié Map.
g La différence entre HashMap et HashTable.

Attention aux étudiants qui apprennent Java ! ! !

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!

Déclaration:
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