- Questions qui recoupent cette série d'articles afin de ne pas dupliquer à nouveau les informations. Je recommande de lire ces documents, car ils contiennent les questions d'entretien Java Core les plus courantes (populaires).
- Les questions sur DOU sont présentées en ukrainien, mais j'aurai tout ici en russe.
- Les réponses pourraient être décrites plus en détail, mais je ne le ferai pas, car la réponse à chaque question pourrait alors prendre un article entier. Et ils ne vous poseront pas de questions aussi détaillées lors d’un entretien.
11. Nommez toutes les méthodes de la classe Object
La classe Object dispose de 11 méthodes :- Class<?> getClass() — obtient la classe de l'objet actuel ;
- int hashCode() — obtenir le code de hachage de l'objet actuel ;
- booléen égal(Object obj) - comparaison de l'objet actuel avec un autre ;
- Object clone() - crée et renvoie une copie de l'objet actuel ;
- String toString() — obtenir une représentation sous forme de chaîne d'un objet ;
- void notify() - réveil d'un thread en attente sur le moniteur de cet objet (la sélection du thread est aléatoire) ;
- void notifyAll() - réveille tous les threads en attente sur le moniteur de cet objet ;
- void wait() - fait passer le thread actuel en mode veille (le gèle) sur le moniteur actuel, fonctionne uniquement dans un bloc synchronisé jusqu'à ce qu'une notification ou un notifyAll réveille le thread ;
- void wait(long timeout) - gèle également le thread actuel sur le moniteur actuel (sur celui actuellement synchronisé), mais avec une minuterie pour quitter cet état (ou encore : jusqu'à ce que notify ou notifyAll se réveille) ;
- void wait(long timeout, int nanos) - une méthode similaire à celle décrite ci-dessus, mais avec des minuteries plus précises pour sortir du gel ;
- void finalize() - avant de supprimer cet objet, le garbage collector appelle cette méthode (enfin). Il est utilisé pour nettoyer les ressources occupées.
12. Quelle est la différence entre try-with-resources et try-catch-finally lorsqu'il s'agit de ressources ?
Généralement, lors de l'utilisation de try-catch-finally, le bloc final était utilisé pour fermer les ressources. Java 7 a introduit un nouveau type d'opérateur try-with-resources , un analogue de try-catch-finally pour libérer des ressources, mais plus compact et lisible. Rappelons à quoi ressemble try-catch-finally :String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Réécrivons maintenant ce code, mais en utilisant try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
C’est en quelque sorte devenu plus facile, tu ne trouves pas ? En plus de la simplification, il y a quelques points :
-
Dans try-with-resources , les ressources déclarées entre parenthèses (qui seront fermées) doivent implémenter l'interface AutoCloseable et sa seule méthode, close() .
La méthode close est exécutée dans un bloc final implicite , sinon comment le programme comprendra-t-il exactement comment fermer une ressource donnée ?
Mais, très probablement, vous écrirez rarement vos propres implémentations de ressources et leur méthode de fermeture.
-
Séquence d'exécution du bloc :
- essayez de bloquer .
- Implicite finalement .
- Un bloc catch qui intercepte les exceptions des étapes précédentes.
- Explicite enfin .
En règle générale, les exceptions qui apparaissent plus bas dans la liste interrompent celles qui apparaissent plus haut.
13. Que sont les opérations au niveau du bit ?
Les opérations au niveau du bit sont des opérations sur des chaînes de bits qui incluent des opérations logiques et des décalages au niveau du bit. Opérations logiques :-
ET au niveau du bit - compare les valeurs des bits et, dans le processus, tout bit défini sur 0 (faux) définit le bit correspondant dans le résultat sur 0. Autrement dit, si dans les deux valeurs comparées, le bit était 1 (vrai), le le résultat sera également 1.
Noté - ET , &
Exemple : 10111101 & 01100111 = 00100101
-
OU au niveau du bit est l’opération inverse de la précédente. Tout bit défini sur 1 définit un bit similaire dans le résultat à 1. Et par conséquent, si le bit était 0 dans les deux valeurs comparées, le bit résultant sera également 0.
Noté - OU , |
Exemple : 10100101 | 01100011 = 11100111
-
NOT au niveau du bit - appliqué à une valeur, inverse (inverse) les bits. Autrement dit, les bits qui étaient 1 deviendront 0 ; et ceux qui étaient 0 deviendront 1.
Noté - PAS , ~
Exemple : ~10100101 = 01011010
OU exclusif au niveau du bit - compare les valeurs des bits, et si dans les deux valeurs le bit est égal à 1, alors le résultat sera 0, et si dans les deux valeurs le bit est 0, le résultat sera 0. Autrement dit, pour que le résultat soit égal à 1, il faut qu'un seul des bits soit égal à 1, et le second soit égal à 0. Noté - XOR , ^
Exemple : 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Quelles classes immuables standard sont des objets en Java ?
Immuable est un objet qui ne permet pas de modifier ses paramètres d'origine. Il peut contenir des méthodes qui renvoient de nouveaux objets d'un type donné, avec des paramètres que vous souhaitez modifier. Quelques objets immuables standards :- L’objet immuable de loin le plus célèbre en Java est String ;
- instances de classes wrapper qui encapsulent les types standard : Boolean, Character, Byte, Short, Integer, Long, Double, Float ;
- objets qui sont généralement utilisés pour des nombres particulièrement GRANDS - BigInteger et BigDecimal ;
- un objet qui est une unité dans les traces de pile (par exemple, dans une trace de pile d'exception) StackTraceElement ;
- un objet de la classe File - peut modifier des fichiers, mais en même temps il est lui-même immuable ;
- UUID - qui est souvent utilisé comme identifiant unique pour les éléments ;
- tous les objets de classe du package java.time ;
- Locale - utilisé pour définir une région géographique, politique ou culturelle.
15. Quels sont les avantages d'un objet immuable par rapport aux objets ordinaires ?
- De tels objets sont sûrs lorsqu'ils sont utilisés dans un environnement multithread . En les utilisant, vous n'avez pas à craindre de perdre des données en raison de conditions de course aux threads. Contrairement au travail avec des objets ordinaires : dans ce cas, vous devrez réfléchir très attentivement et élaborer les mécanismes d'utilisation de l'objet dans un environnement parallèle.
- Les objets immuables sont de bonnes clés dans une carte, car si vous utilisez un objet mutable et que l'objet change ensuite d'état, cela peut devenir déroutant lors de l'utilisation d'un HashMap : l'objet sera toujours présent, et si vous utilisez containKey(), il se peut qu'il ne le soit pas. être trouvé.
- Les objets immuables sont parfaits pour stocker des données immuables (constantes) qui ne doivent jamais être modifiées pendant l'exécution du programme.
- "Atomicité jusqu'à l'échec" - si un objet immuable lève une exception, il ne restera toujours pas dans un état indésirable (cassé).
- Ces cours sont faciles à tester.
- Des mécanismes supplémentaires tels qu'un constructeur de copie et une implémentation de clone ne sont pas nécessaires.
Questions sur la POO
16. Quels sont les avantages de la POO en général et par rapport à la programmation procédurale ?
Alors, les avantages de la POO :- Les applications complexes sont plus faciles à écrire que la programmation procédurale, puisque tout est décomposé en petits modules - des objets qui interagissent les uns avec les autres - et par conséquent, la programmation se résume à des relations entre objets.
- Les applications écrites en POO sont beaucoup plus faciles à modifier (à condition que les concepts de conception soient suivis).
- Étant donné que les données et les opérations qu'elles contiennent forment une seule entité, elles ne sont pas réparties dans toute l'application (ce qui arrive souvent avec la programmation procédurale).
- L'encapsulation des informations protège les données les plus critiques de l'utilisateur.
- Il est possible de réutiliser le même code avec des données différentes, car les classes permettent de créer de nombreux objets, chacun ayant ses propres valeurs d'attribut.
- L'héritage et le polymorphisme vous permettent également de réutiliser et d'étendre le code existant (au lieu de dupliquer des fonctionnalités similaires).
- Extensibilité de l'application plus facile qu'avec une approche procédurale.
- L'approche POO permet de faire abstraction des détails de mise en œuvre.
17. Dites-nous quelles sont les lacunes de la POO
Malheureusement, ils sont également présents :- La POO nécessite beaucoup de connaissances théoriques qui doivent être maîtrisées avant de pouvoir écrire quoi que ce soit.
- Les idées de la POO ne sont pas si faciles à comprendre et à appliquer dans la pratique (il faut être un peu philosophe dans l'âme).
- Lors de l'utilisation de la POO, les performances du logiciel sont légèrement réduites en raison de l'organisation plus complexe du système.
- L'approche POO nécessite plus de mémoire, puisque tout est constitué de classes, d'interfaces, de méthodes, qui occupent beaucoup plus de mémoire que les variables ordinaires.
- Le temps requis pour l’analyse initiale est plus long que pour l’analyse procédurale.
18. Qu'est-ce que le polymorphisme statique et dynamique
Le polymorphisme permet aux objets de se comporter différemment pour la même classe ou interface. Il existe deux types de polymorphisme, également appelés liaisons précoces et tardives . Polymorphisme statique, ou liaison antérieure :- se produit au moment de la compilation (au début du cycle de vie du programme) ;
- décide quelle méthode exécuter au moment de la compilation ;
- La surcharge de méthodes est un exemple de polymorphisme statique ;
- la liaison anticipée inclut les méthodes privées, statiques et terminales ;
- l'héritage n'est pas impliqué dans la liaison précoce ;
- Le polymorphisme statique n'implique pas d'objets spécifiques, mais des informations sur la classe dont le type est représenté à gauche du nom de la variable.
- se produit au moment de l'exécution (pendant que le programme est en cours d'exécution) ;
- le polymorphisme dynamique décide quelle implémentation spécifique une méthode aura au moment de l'exécution ;
- le remplacement de méthode est un exemple de polymorphisme dynamique ;
- la liaison tardive est l'affectation d'un objet spécifique, d'une référence de son type ou de sa superclasse ;
- l'héritage est associé au polymorphisme dynamique.
GO TO FULL VERSION