- 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.