- Je sauterai les questions qui chevauchent cette série d'articles afin de ne pas dupliquer inutilement les informations. Je recommande de lire ces articles car ils couvrent les questions d'entretien Java Core les plus courantes (populaires).
- Je pourrais décrire les réponses plus en détail, mais je ne le ferai pas, car chaque réponse pourrait alors s'éterniser sur tout l'article. Et personne ne vous demandera ce niveau de détail lors d’un entretien d’embauche.
11. Nommez toutes les méthodes de la classe Object
La classe Object dispose de 11 méthodes :-
Class<?> getClass() — récupère la classe de l'objet actuel ;
-
int hashCode() — récupère le code de hachage de l'objet actuel ;
-
boolean equals(Object obj) — compare l'objet actuel avec un autre objet ;
-
Object clone() — crée et renvoie une copie de l'objet actuel ;
-
String toString() — obtient la représentation sous forme de chaîne de l'objet ;
-
void notify() — réveille un thread en attente sur le moniteur de cet objet (le choix du thread est aléatoire) ;
-
void notifyAll() — réveille tous les threads en attente sur le moniteur de cet objet ;
-
void wait() — fait attendre le thread actuel sur le moniteur actuel (gele le thread actuel) jusqu'à ce qu'un appel notify ou notifyAll réveille le thread (ne fonctionne que dans un bloc synchronisé) ;
-
void wait(long timeout) — fait attendre le thread actuel sur le moniteur actuel (sur le bloc synchronisé actuel), mais avec un délai d'attente pour quitter l'état d'attente (ou encore, jusqu'à ce qu'un appel notify ou notifyAll réveille le thread) ;
-
void wait(long timeout, int nanos) — cette méthode est comme la méthode précédente, mais avec un délai d'attente plus précis ;
-
void finalize() — cette méthode est appelée (enfin) avant que l'objet ne soit supprimé par le garbage collector. Il est utilisé pour nettoyer les ressources acquises.
12. Quelle est la différence entre try-with-resources et try-catch-finally lorsque l'on travaille avec des ressources ?
Généralement, lors de l'utilisation de try-catch-finally , le bloc final est utilisé pour fermer les ressources. Java 7 introduit la nouvelle instruction try-with-resources . C'est analogue à 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 plus simple, vous ne trouvez pas ? En plus du code plus simple, il y a quelques autres points à noter :
-
Dans try-with-resources , les ressources déclarées entre parenthèses (ressources 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 déterminerait-il exactement comment fermer la ressource ?
Mais vous écrirez probablement rarement vos propres implémentations de ressources et leur méthode de fermeture.
-
Les blocs sont exécutés dans cet ordre :
- Le bloc try .
- Le bloc implicite final .
- Le bloc catch , qui intercepte les exceptions qui se produisent au cours des étapes précédentes.
- Le bloc final explicite.
En règle générale, les exceptions lancées plus bas dans la liste interrompent celles lancées 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 séquences de bits. Ils incluent des opérations logiques et des décalages au niveau des bits. Opérateurs logiques:-
ET au niveau du bit — Compare les valeurs de bits. Tout bit défini sur 0 (faux) définit le bit correspondant dans le résultat sur 0. Autrement dit, si un bit est 1 (vrai) dans les deux valeurs comparées, alors le bit résultant sera également 1.
Noté AND ou &
Exemple : 10111101 & 01100111 = 00100101
-
OU au niveau du bit — Cette opération est à l’opposé de la précédente. Tout bit défini sur 1 définit le bit correspondant dans le résultat sur 1. Par conséquent, si le bit est 0 dans les deux valeurs comparées, alors le bit résultant sera également 0.
Noté OR ou |
Exemple : 10100101 | 01100011 = 11100111
-
NOT au niveau du bit — Cet opérateur est appliqué à une seule valeur. Il retourne (inverse) les bits. Autrement dit, les bits qui étaient 1 deviennent 0 ; et ceux qui étaient 0 deviennent 1.
Noté PAS ou ~
Exemple : ~10100101 = 01011010
-
OU exclusif au niveau du bit — Compare les valeurs de bits. Si les deux bits sont 1, alors le bit résultant est 0. Si les deux bits sont 0, alors le bit résultant est 0. En d’autres termes, pour que le bit résultant soit 1, un seul des bits doit être 1, et l'autre bit doit être 0.
Noté XOR ou ^
Exemple : 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Quels objets immuables standards existe-t-il en Java ?
Un objet est immuable s’il ne permet pas à ses valeurs d’origine de changer. Il peut avoir des méthodes qui renvoient de nouveaux objets du même type avec des valeurs différentes. Certains objets immuables standard incluent :- sans aucun doute, le type immuable le plus célèbre de Java est String ;
- instances des classes wrapper qui encapsulent les types standard : Boolean, Character, Byte, Short, Integer, Long, Double, Float ;
- Objets BigInteger et BigDecimal, qui sont généralement utilisés pour les nombres particulièrement GRANDS ;
- Objets StackTraceElement qui constituent une trace de pile (par exemple, la trace de pile d'une exception) ;
- un objet de la classe File — il peut modifier des fichiers, mais en même temps l'objet lui-même reste inchangé ;
- Les UUID, qui sont souvent utilisés pour identifier des éléments de manière unique ;
- tous les objets des classes du package java.time ;
- Objets locaux, utilisés pour identifier une région géographique, politique ou culturelle.
15. Quels sont les avantages d’un objet immuable par rapport aux objets ordinaires ?
-
Les objets immuables peuvent être utilisés en toute sécurité dans un environnement multithread . Ils font en sorte que vous n'ayez pas à vous soucier de la perte de données due à des conditions de concurrence. C'est différent lorsque vous travaillez avec des objets ordinaires. Dans ce cas, vous devez réfléchir et proposer de bons mécanismes lors de l’utilisation de l’objet dans un environnement parallèle.
-
Les objets immuables sont bons comme clés dans une carte. Si vous utilisez un objet mutable comme clé HashMap et que l'état de l'objet change, alors la structure des données pourrait être confuse : l'objet sera toujours présent, mais si vous utilisez containKey(), vous risquez de ne pas le trouver.
-
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.
-
Un autre avantage est l’atomicité des échecs. Si un objet immuable lève une exception, il ne sera pas laissé dans un état indésirable (cassé).
-
Ces cours sont faciles à tester.
-
Vous n'avez besoin d'aucun mécanisme supplémentaire tel qu'un constructeur de copie ou la mise en œuvre du clonage d'objet.
Questions sur la POO
16. Quels sont les avantages de la POO en général et par rapport à la programmation procédurale ?
Bon, avantages de la POO :-
Les applications complexes sont plus faciles à écrire en POO qu’en 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 est réduite à des relations entre objets.
-
Les applications écrites en POO sont beaucoup plus faciles à modifier (lorsque les principes de conception sont correctement respectés).
-
Étant donné que les données et les opérations de données forment une seule entité, elles ne sont pas réparties partout dans l'application (ce qui est souvent le cas dans la programmation procédurale).
-
Le principe d'encapsulation protège les données les plus critiques de l'utilisateur.
-
Le même code peut être réutilisé avec différentes données car les classes vous permettent de créer de nombreux objets, chacun avec ses propres valeurs.
-
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).
-
Prolonger une demande est plus simple qu’avec une approche procédurale.
-
L'approche POO permet de faire abstraction des détails de mise en œuvre.
17. Dites-nous quels sont les inconvénients de la POO
Malheureusement, ils existent aussi :-
La POO nécessite beaucoup de connaissances théoriques qu’il faut maîtriser avant de pouvoir écrire quoi que ce soit.
-
Les idées de POO ne sont pas si faciles à comprendre et à appliquer dans la pratique (il faut être un peu philosophe dans l'âme).
-
La POO réduit légèrement les performances d'un programme en raison de la complexité accrue 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 une approche procédurale.
18. Qu'est-ce que le polymorphisme statique par rapport au polymorphisme dynamique ?
Le polymorphisme permet aux objets de la même classe ou interface de se comporter différemment. Il existe deux types de polymorphisme, également appelés liaisons précoces et tardives. Polymorphisme statique, ou liaison précoce :- 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éthode est un exemple de polymorphisme statique ;
- la liaison anticipée inclut les méthodes privées, statiques et finales ;
- l'héritage n'est pas impliqué dans la liaison précoce ;
- le polymorphisme statique n'implique pas d'objets spécifiques, mais plutôt des informations sur le type de classe qui apparaissent à gauche du nom d'une 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 ;
- une liaison tardive signifie attribuer un objet spécifique, une référence de son type ou sa superclasse ;
- l'héritage est associé au polymorphisme dynamique.
GO TO FULL VERSION