Dans cet article, nous discuterons de divers types de questions d'entrevue dans les entretiens Java qui permettent aux employeurs de tester les capacités de programmation Java et d'objets communes. Les chapitres suivants sont divisés en deux articles précédents et suivants. Le premier article discutera de la programmation orientée objet et de ses caractéristiques, des questions courantes sur Java et ses fonctions, les classes de collecte Java, les collectionneurs de déchets, et le deuxième article discutera principalement de la gestion des exceptions, des applets Java, du swing, du JDBC, des appels de méthode distante (RMI), des servlets et JSP.
commencer!
Table des matières
Programmation orientée objet (POO)
Problèmes de Java communs
Filetages Java
Classe de collection Java
Éboueur
Programmation orientée objet (POO)
Java est un langage de programmation informatique qui prend en charge simultanément, basé sur les classes et orientée objet. Les avantages du développement de logiciels orientés objet sont répertoriés ci-dessous:
La programmation orientée objet a de nombreuses caractéristiques importantes, telles que: l'encapsulation, l'héritage, le polymorphisme et l'abstraction. Dans les chapitres suivants, nous analyserons ces caractéristiques une par une.
Emballer
L'encapsulation offre aux objets la possibilité de masquer les caractéristiques et les comportements internes. Un objet fournit certaines méthodes accessibles par d'autres objets pour modifier les données à l'intérieur. En Java, il y a 3 modificateurs: public, privé et protégé. Chaque modificateur donne des droits d'accès différents à d'autres objets situés dans le même package ou sous différents packages.
Voici quelques-uns des avantages de l'utilisation de l'encapsulation:
Reportez-vous à ce document pour plus de détails et d'exemples sur l'encapsulation.
Polymorphe
Le polymorphisme est une capacité des langages de programmation pour démontrer les mêmes interfaces pour différents types de données sous-jacentes. Les opérations sur un type polymorphe peuvent être appliquées à d'autres types de valeurs.
hériter
L'héritage offre aux objets la capacité d'obtenir des champs et des méthodes à partir de classes de base. L'héritage fournit des lignes de code réutilisées et peut également ajouter de nouvelles fonctionnalités aux classes existantes sans les modifier.
abstrait
L'abstraction est l'étape de séparation des idées des instances concrètes, alors créez des classes en fonction de leur fonctionnalité plutôt que des détails de mise en œuvre. Java prend en charge la création de classes abstraites qui n'exposent que les interfaces mais n'incluent pas les implémentations de méthode. L'objectif principal de cette technique abstrait est de séparer le comportement de la classe des détails de la mise en œuvre.
La différence entre l'abstraction et l'encapsulation
L'abstraction et l'encapsulation sont des concepts complémentaires. D'une part, le résumé se concentre sur le comportement des objets. D'un autre côté, l'encapsulation se concentre sur les détails du comportement de l'objet. Généralement, l'encapsulation est obtenue en cachant les informations d'état interne de l'objet. Par conséquent, l'encapsulation peut être considérée comme une stratégie pour fournir une abstraction.
Problèmes de Java communs
1. Qu'est-ce qu'une machine virtuelle Java? Pourquoi Java est-il appelé un "langage de programmation indépendant de la plate-forme"?
Une machine virtuelle Java est un processus de machine virtuelle qui peut exécuter Java Bytecode. Le fichier source Java est compilé dans un fichier bytecode qui peut être exécuté par une machine virtuelle Java.
Java est conçu pour permettre aux applications de s'exécuter sur n'importe quelle plate-forme sans exiger que les programmeurs réécrivent ou recompilent chaque plate-forme séparément. Les machines virtuelles Java rendent cela possible car il connaît la longueur d'instruction et d'autres fonctionnalités de la plate-forme matérielle sous-jacente.
2. Quelle est la différence entre JDK et JRE?
Le Java Runtime Environment (JRE) est une machine virtuelle Java qui exécutera des programmes Java. Il comprend également des plugins de navigateur requis pour exécuter des applets. La Java Development Toolkit (JDK) est un progiciel complet de développement de logiciels Java qui comprend JRE, le compilateur et d'autres outils (tels que Javadoc, Java Debugger), qui permet aux développeurs de développer, compiler et exécuter des applications Java.
3. Que signifie le mot-clé «statique»? Puis-je remplacer une méthode privée ou statique en Java?
Le mot-clé "statique" indique qu'une variable de membre ou une méthode membre est accessible sans une variable d'instance de la classe à laquelle il appartient.
La méthode statique de Java ne peut pas être écrasée car la méthode écrasée est basée sur la liaison dynamique d'exécution, tandis que la méthode statique est la liaison statique au moment de la compilation. La méthode statique n'est liée à aucune instance de la classe, donc elle ne s'applique pas conceptuellement.
4. Est-il possible d'accéder aux variables non statiques dans un environnement statique?
La variable statique appartient à la classe en Java, et sa valeur dans tous les cas est la même. Lorsque la classe est chargée par une machine virtuelle Java, la variable statique sera initialisée. Si votre code essaie d'accéder à des variables non statiques sans cas, le compilateur rapportera une erreur car ces variables n'ont pas encore été créées et n'ont été associées à aucune instance.
5. Quels sont les types de données pris en charge par Java? Qu'est-ce que le démontage automatique?
Les types de données de base pris en charge par la langue Java sont:
La boxe automatique est une conversion effectuée par le compilateur Java entre le type de données de base et le type de wrapper d'objet correspondant. Par exemple: convertir INT en entier, double en double, etc. Sinon, c'est un déballage automatique.
6. Que signifie la mise en place de la méthode et la surcharge de la méthode dans Java?
La surcharge de méthode dans Java se produit lorsque deux méthodes ou plus ont les mêmes noms de méthode mais différents paramètres dans la même classe. En revanche, la remplacement de la méthode signifie que la sous-classe redéfinit la méthode de la classe parent. Les remplacements de la méthode doivent avoir le même nom de méthode, la même liste de paramètres et le type de retour. L'écran peut ne pas restreindre l'accès aux méthodes qu'il couvre.
7.Quel est un constructeur en Java? Qu'est-ce que la surcharge du constructeur? Qu'est-ce qu'un constructeur de copie?
Lorsqu'un nouvel objet est créé, le constructeur est appelé. Chaque classe a un constructeur. Lorsque le programmeur ne fournit pas de constructeur à la classe, le compilateur Java créera un constructeur par défaut pour la classe.
La surcharge du constructeur et la surcharge de méthode en Java sont très similaires. Plusieurs constructeurs peuvent être créés pour une classe. Chaque constructeur doit avoir sa propre liste de paramètres unique.
Java ne prend pas en charge les constructeurs de copies comme en C ++. Cette différence est parce que si vous n'écrivez pas le constructeur vous-même, Java ne créera pas le constructeur de copie par défaut.
8. Java prend-il en charge l'héritage multiple?
Non pris en charge, Java ne prend pas en charge l'héritage multiple. Chaque classe ne peut hériter qu'une seule classe, mais peut implémenter plusieurs interfaces.
9. Quelle est la différence entre une interface et une classe abstraite?
Java fournit et soutient la création de classes et d'interfaces abstraits. Leurs implémentations ont des similitudes et les différences sont:
Vous pouvez également vous référer à la différence entre les classes abstraites et les interfaces dans JDK8
10.Quelles sont-elles passées par la valeur et la référence?
L'objet est passé par une valeur, ce qui signifie qu'une copie de l'objet est passé. Par conséquent, même si la copie de l'objet est modifiée, la valeur de l'objet source ne sera pas affectée.
Un objet est passé par référence, ce qui signifie que ce n'est pas l'objet réel passé, mais la référence de l'objet. Par conséquent, les modifications externes de l'objet référencé seront reflétées sur tous les objets.
Filetages Java
11. Quelle est la différence entre un processus et un fil?
Un processus est une application d'exécution et un thread est une séquence d'exécution dans le processus. Un processus peut avoir plusieurs threads. Les threads sont également appelés processus légers.
12. Combien de manières différentes y a-t-il pour créer des fils? Lequel aimez-vous? Pourquoi?
Il existe trois façons de créer des fils:
La mise en œuvre de l'interface Runnable est plus populaire car elle ne nécessite pas d'hérédier la classe de threads. Lorsque d'autres objets ont été hérités dans la conception de l'application, cela nécessite un héritage multiple (bien que Java ne prenne pas en charge l'héritage multiple), il ne peut implémenter que des interfaces. Dans le même temps, les pools de threads sont également très efficaces et faciles à implémenter et à utiliser.
13. Une explication sommaire de plusieurs états disponibles des fils.
Pendant l'exécution, les threads peuvent être dans les états suivants:
14. Quelle est la différence entre la méthode de synchronisation et le bloc de code de synchronisation?
En langue java, chaque objet a une serrure. Les threads peuvent utiliser le mot clé synchronisé pour obtenir des verrous sur les objets. Le mot-clé synchronisé peut être appliqué au niveau de la méthode (verrou à grain grossier) ou au niveau du bloc de code (verrouillage à grain fin).
15. Comment synchroniser les threads dans le moniteur? Quel niveau de synchronisation le programme devrait-il faire?
Les moniteurs et les verrous sont utilisés ensemble dans les machines virtuelles Java. Le moniteur surveille un bloc de code synchrone, garantissant qu'un seul thread exécute le bloc de code synchrone à la fois. Chaque moniteur est associé à une référence d'objet. Les threads ne permettent pas d'exécuter le code de synchronisation avant d'acquérir le verrou.
16. Qu'est-ce que l'impasse?
Lorsque les deux processus attendent que l'autre partie termine l'exécution avant de continuer à s'exécuter, une impasse se produit. Le résultat est que les deux processus sont piégés dans une attente infinie.
17. Comment s'assurer que N Threads peut accéder à N ressources sans provoquer des impasses?
Lorsque vous utilisez le multithreading, un moyen très simple d'éviter les impasses est de spécifier l'ordre dans lequel les serrures sont acquises et de forcer le fil à acquérir les serrures dans l'ordre spécifié. Par conséquent, si tous les threads verrouillent et relâchent les verrouillage dans le même ordre, il n'y aura pas de blocage.
Classe de collection Java
18. Quelles sont les interfaces de base du cadre de classe de collection Java?
Les classes de collecte Java fournissent un ensemble bien conçu d'interfaces et de classes qui prennent en charge les opérations sur un ensemble d'objets. Les interfaces les plus élémentaires dans les classes de collecte Java sont:
19. Pourquoi la classe de collecte n'implémente-t-elle pas les interfaces clonables et sérialisables?
L'interface de classe de collection spécifie un ensemble d'objets appelés éléments. Chaque classe d'implémentation spécifique de l'interface de classe de collection peut choisir d'enregistrer et de trier les éléments à sa manière. Certaines classes de collecte permettent des clés en double, tandis que d'autres non.
20.Quel est un itérateur?
L'interface itérateur fournit de nombreuses façons d'itérer les éléments de collecte. Chaque classe de collecte contient des méthodes itératives qui peuvent renvoyer une instance itérateur. L'itérateur peut supprimer les éléments de la collection sous-jacente pendant l'itération.
La sémantique et les significations du clonage ou de la sérialisation sont liées à des implémentations spécifiques. Par conséquent, l'implémentation spécifique de la classe de collecte devrait déterminer comment être cloné ou sérialisé.
21. Quelle est la différence entre Iterator et ListIterator?
La différence est répertoriée ci-dessous:
22. Quelle est la différence entre la défaillance rapide (échec) et la défaillance sûre (sécurisé)?
La défaillance de la sécurité d'Iterator est basée sur la fabrication de copies de la collection sous-jacente, il n'est donc pas affecté par les modifications sur la collection Source. Toutes les classes de collecte dans le package java.util échouent rapidement, tandis que toutes les classes du package java.util.concurrent échouent en toute sécurité. Un itérateur à tails rapides lancera une exception de laModification ConcurrentModification, tandis qu'un itérateur en toute sécurité ne lancera jamais une telle exception.
23. Quel est le principe de travail de Hashmap en Java?
Hashmap in Java stocke les éléments sous la forme de paires de valeurs clés. HashMap nécessite une fonction de hachage qui utilise des méthodes HashCode () et Equals () pour ajouter et récupérer des éléments à / depuis la collection. Lorsque la méthode put () est appelée, HashMap calculera la valeur de hachage de la clé, puis stockera les paires de valeur de clé sur l'index approprié dans l'ensemble. Si la clé existe déjà, la valeur sera mise à jour vers une nouvelle valeur. Certaines caractéristiques importantes de Hashmap sont sa capacité, son facteur de charge et son redimensionnement du seuil.
24. Où se reflète l'importance des méthodes HashCode () et Equals ()?
Hashmap dans Java utilise des méthodes HashCode () et Equals () pour déterminer l'indice des paires de valeurs clés. Ces deux méthodes seront également utilisées lors de l'obtention de valeurs en fonction des clés. Si ces deux méthodes ne sont pas implémentées correctement, deux clés différentes peuvent avoir la même valeur de hachage et peuvent donc être considérées comme égales par l'ensemble. De plus, ces deux méthodes sont également utilisées pour découvrir des éléments en double. Par conséquent, la mise en œuvre de ces deux méthodes est cruciale pour la précision et l'exactitude de Hashmap.
25. Quelle est la différence entre le hashmap et le hashtable?
26. Quelle est la différence entre un tableau (tableau) et une liste (ArrayList)? Quand dois-je utiliser Array au lieu de ArrayList?
Le suivant répertorie les différences entre le tableau et l'arrayList:
27. Quelle est la différence entre ArrayList et LinkedList?
ArrayList et LinkedList implémentent les interfaces de liste, et ils ont les différences suivantes:
ArrayList est une interface de données basée sur l'index, et sa couche sous-jacente est un tableau. Il permet un accès aléatoire aux éléments avec une complexité temporelle O (1). En conséquence, LinkedList stocke ses données sous la forme d'une liste d'éléments, chaque élément est lié à ses éléments précédents et suivants. Dans ce cas, la complexité du temps de trouver un élément est O (n).
Par rapport à ArrayList, l'insertion, l'addition et la suppression de LinkedList sont plus rapides car lorsque des éléments sont ajoutés à n'importe quelle position de la collection, il n'est pas nécessaire de recalculer la taille ou de mettre à jour l'index comme un tableau.
LinkedList prend plus de mémoire que ArrayList car LinkedList stocke deux références pour chaque nœud, une pointant vers l'élément précédent et un pointant vers l'élément suivant.
Vous pouvez également vous référer à ArrayList vs LinkedList.
28. Que font les interfaces comparables et de comparaison? Énumérez leurs différences.
Java fournit une interface comparable qui ne contient qu'une seule méthode compareto (). Cette méthode peut trier deux objets. Plus précisément, il renvoie un nombre négatif, 0 et un nombre positif pour indiquer que l'objet d'entrée est inférieur, égal à et supérieur à l'objet déjà existant.
Java fournit une interface de comparaison qui comprend deux méthodes: compare () et equals (). La méthode Compare () est utilisée pour trier deux paramètres d'entrée, le renvoi d'un nombre négatif, 0, et un nombre positif indique que le premier paramètre est inférieur, égal à et supérieur au deuxième paramètre. La méthode equals () nécessite un objet en tant que paramètre, qui est utilisé pour déterminer si le paramètre d'entrée est égal au comparateur. Cette méthode ne renvoie pas vrai uniquement lorsque le paramètre d'entrée est également un comparateur et que le paramètre d'entrée et le résultat de tri du comparateur actuel sont les mêmes.
29. Qu'est-ce qu'une file d'attente prioritaire Java?
PriorityQueue est une file d'attente illimitée basée sur le tas de priorité, et ses éléments sont triés par ordre naturel. Lorsqu'il est créé, nous pouvons lui fournir un comparateur responsable du tri des éléments. PriorityQueue ne permet pas les valeurs nulles car ils n'ont pas d'ordre naturel, ou ils n'ont pas de comparateurs associés. Enfin, PriorityQueue n'est pas une file d'attente et la complexité temporelle des entrants et de la déshabitation est O (log (n)).
30. Comprenez-vous le grand symbole O (notation Big-O)? Pouvez-vous donner des exemples de différentes structures de données?
Le grand symbole O décrit à quel point l'échelle ou les performances de l'algorithme est bonne dans le pire scénario lorsque les éléments de la structure des données augmentent.
Les grands symboles O peuvent également être utilisés pour décrire d'autres comportements, tels que la consommation de mémoire. Étant donné que les classes de collecte sont en fait des structures de données, nous utilisons généralement de grands symboles O pour choisir la meilleure implémentation en fonction du temps, de la mémoire et des performances. Les grands symboles O peuvent donner une bonne explication des performances de grandes quantités de données.
31. Comment traditionner d'utilisation d'un tableau non ordonné ou d'un tableau ordonné?
Le plus grand avantage d'un tableau ordonné est que la complexité temporelle de la recherche est O (log n), tandis que le tableau non ordonné est O (n). L'inconvénient des tableaux ordonnés est que la complexité temporelle de l'opération d'insertion est O (n), car les éléments avec de grandes valeurs doivent être reculés pour faire de la place pour le nouvel élément. En revanche, la complexité du temps d'insertion d'un tableau non ordonné est la constante O (1).
32. Quelles sont les meilleures pratiques pour les frameworks de classe de collection Java?
La sélection correcte du type de collection à utiliser en fonction des besoins de l'application est très importante pour les performances. Par exemple: si la taille de l'élément est fixe et peut être connue à l'avance, nous devons utiliser Array au lieu de ArrayList.
Certaines classes de collecte permettent de spécifier la capacité initiale. Par conséquent, si nous pouvons estimer le nombre d'éléments stockés, nous pouvons définir la capacité initiale pour éviter de recalculer la valeur de hachage ou de l'élargir.
Pour la sécurité, la lisibilité et la robustesse de type, les génériques sont toujours utilisés. Dans le même temps, l'utilisation de génériques peut également éviter ClassCastException au moment de l'exécution.
L'utilisation de la classe immuable fournie par JDK comme clé de la carte peut éviter d'implémenter les méthodes HashCode () et Equals () pour nos propres classes.
Les interfaces sont meilleures que la mise en œuvre lors de la programmation.
Lorsque la collection sous-jacente est réellement vide, renvoyez un ensemble ou un tableau avec la longueur 0 et ne retournez pas null.
33. Quelles sont les différences entre l'interface d'énumération et l'interface itérateur?
L'énumération est deux fois plus rapide que l'itérateur, tout en consommant moins de mémoire. Cependant, Iterator est beaucoup plus sûr que l'énumération, car d'autres threads ne peuvent pas modifier des objets de la collection traversés par Iterator. Dans le même temps, Iterator permet à l'appelant de supprimer des éléments de la collection sous-jacente, ce qui est impossible pour l'énumération.
34. Quelle est la différence entre Hashset et Treeset?
HashSet est mis en œuvre par une table de hachage, de sorte que ses éléments ne sont pas ordonnés. La complexité temporelle des méthodes add (), retira () et contient () est O (1).
D'un autre côté, Treeset est mis en œuvre par une structure en forme d'arbre, et les éléments à l'intérieur sont ordonnés. Par conséquent, la complexité temporelle des méthodes ADD (), retire () et contient () est O (Logn).
Collectionneurs à ordures
35. Quel est le but de la collection des ordures à Java? Quand les ordures seront-elles collectées?
Le but de la collecte des ordures est d'identifier et de jeter les objets que l'application n'utilise plus pour libérer et réutiliser des ressources.
36. Que fera System.gc () et Runtime.gc ()?
Ces deux méthodes sont utilisées pour inciter le JVM à effectuer la collection des ordures. Cependant, commencer immédiatement ou retarder la collecte des ordures dépend de la JVM.
37. Quand la méthode finalisée () est-elle appelée? Quel est le but des destructeurs?
Avant de libérer la mémoire occupée par l'objet, le collecteur des ordures appelle la méthode finaliser () de l'objet. Il est généralement recommandé de libérer des ressources détenues par des objets dans cette méthode.
38. Si la référence de l'objet est définie sur NULL, le collecteur des ordures libérera-t-il immédiatement la mémoire occupée par l'objet?
Non, cet objet sera recyclable dans le prochain cycle de collecte des ordures.
39. À quoi ressemble la structure du tas de Java? Qu'est-ce que l'espace de Gen Perm dans le tas?
Le tas de JVM est la zone de données d'exécution, et toutes les instances et tableaux de classes sont alloués de la mémoire sur le tas. Il est créé lorsque le JVM est démarré. La mémoire de tas occupée par l'objet est collectée par le système automatique de gestion de la mémoire, c'est-à-dire le collecteur des ordures.
La mémoire du tas est composée d'objets qui survivent et meurent. Les objets survivants sont accessibles à l'application et ne seront pas collectés aux ordures. L'objet mort est un objet qui n'est pas accessible à l'application et n'a pas été recyclé par le collecteur des ordures. Ils occuperont l'espace mémoire du tas jusqu'à ce que le collecteur des ordures récupérera ces objets.
40. Quelle est la différence entre un collecteur en série et un collecteur de débit?
Les collectionneurs de débit utilisent des versions parallèles de la prochaine génération de collectionneurs à ordures, qui sont utilisées pour des applications avec des données de taille moyenne et à grande échelle. Les collectionneurs en série sont suffisants pour la plupart des petites applications (besoin d'environ 100 m de mémoire sur les processeurs modernes).
41. En Java, quand les objets peuvent-ils être collectés à la poubelle?
Lorsqu'un objet devient inaccessible à l'application en utilisant actuellement cet objet, l'objet peut être recyclé.
42. La collecte des ordures se produira-t-elle dans la génération permanente de JVM?
La collecte des ordures ne se produira pas dans la génération permanente. Si la génération permanente est complète ou dépasse la valeur critique, elle déclenchera la collection complète des ordures (GC complet). Si vous vérifiez soigneusement les informations de sortie du collecteur des ordures, vous constaterez que la génération permanente est également recyclée. C'est pourquoi la taille de génération permanente correcte est très importante pour éviter le GC complet. Veuillez vous référer à Java 8: De la génération permanente à la zone des métadonnées
(Note du traducteur: la génération permanente a été supprimée dans Java 8, et une nouvelle zone de mémoire indigène appelée la zone de métadonnées a été ajoutée)
Ce qui précède est une compilation des informations sur les questions d'entrevue Java. Nous continuerons d'ajouter des informations pertinentes à l'avenir. Merci pour votre soutien à ce site!