CodeGym/Blog Java/Random-FR/Explorer les questions et réponses d'un entretien d'embau...
John Squirrels
Niveau 41
San Francisco

Explorer les questions et réponses d'un entretien d'embauche pour un poste de développeur Java. Partie 2

Publié dans le groupe Random-FR
membres
Re-bonjour Ă  tous ! Nous continuons Ă  chercher des rĂ©ponses aux questions des dĂ©veloppeurs Java juniors, intermĂ©diaires et seniors. Les questions sont super intĂ©ressantes. Personnellement, j'aime les analyser, car cela m'aide Ă  trouver des lacunes dans mes connaissances thĂ©oriques, et parfois dans les endroits les plus inattendus. Explorer les questions et rĂ©ponses d'un entretien d'embauche pour un poste de dĂ©veloppeur Java.  Partie 2 - 1La partie prĂ©cĂ©dente se trouve dans cet article . Mais avant de commencer, je tiens Ă  vous rappeler que :
  1. 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).
  2. 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.
Je laisserai des liens pour une Ă©tude plus approfondie si vous le souhaitez. Volons!

11. Nommez toutes les méthodes de la classe Object

La classe Object dispose de 11 mĂ©thodes :
  1. Class<?> getClass() — rĂ©cupĂšre la classe de l'objet actuel ;

  2. int hashCode() — rĂ©cupĂšre le code de hachage de l'objet actuel ;

  3. boolean equals(Object obj) — compare l'objet actuel avec un autre objet ;

  4. Object clone() — crĂ©e et renvoie une copie de l'objet actuel ;

  5. String toString() — obtient la reprĂ©sentation sous forme de chaĂźne de l'objet ;

  6. void notify() — rĂ©veille un thread en attente sur le moniteur de cet objet (le choix du thread est alĂ©atoire) ;

  7. void notifyAll() — rĂ©veille tous les threads en attente sur le moniteur de cet objet ;

  8. 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Ă©) ;

  9. 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) ;

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

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

Pour utiliser correctement les mĂ©thodes hashCode , equals , clone , toString et finalize , elles doivent ĂȘtre remplacĂ©es en fonction des spĂ©cificitĂ©s de la tĂąche en cours.

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

  2. Les blocs sont exĂ©cutĂ©s dans cet ordre :

    1. Le bloc try .
    2. Le bloc implicite final .
    3. Le bloc catch , qui intercepte les exceptions qui se produisent au cours des étapes précédentes.
    4. 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.

Imaginez que vous utilisez un try-catch-finally et que vous obtenez une exception dans le bloc try . Ensuite, le bloc catch spĂ©cifiĂ© commence immĂ©diatement Ă  s'exĂ©cuter, dans lequel nous avons Ă©crit une autre exception (par exemple, avec un message dĂ©crivant l'erreur plus en dĂ©tail), et vous souhaitez que la mĂ©thode renvoie cette exception vers le haut. Ensuite, le bloc final est exĂ©cutĂ© et une exception y est Ă©galement levĂ©e. Mais une autre cette fois. Laquelle de ces deux exceptions cette mĂ©thode va-t-elle finalement gĂ©nĂ©rer ? L'exception levĂ©e par le bloc final ! Mais nous arrivons maintenant Ă  un autre point concernant try-with-resources . Voyons comment se comporte try-with-resources dans la mĂȘme situation. Nous obtenons une exception dans le bloc try lorsque nous essayons de fermer des ressources dans la mĂ©thode close() , c'est-Ă -dire dans le bloc implicite enfin . Laquelle de ces exceptions le bloc catch interceptera-t- il ? Celui lancĂ© par le bloc try ! L’exception du bloc implicite final (de la mĂ©thode lose() ) sera ignorĂ©e. Cette ignorance des exceptions est Ă©galement appelĂ©e suppression des exceptions.

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

Les décalages au niveau des bits ( >> et << ) décalent les bits de l'opérande dans la direction spécifiée, du nombre de places spécifié. Les postes vacants sont remplis de zéros. Par exemple:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
L'exception est lorsque vous dĂ©calez un nombre nĂ©gatif vers la droite. Comme vous vous en souviendrez, le premier bit d'un nombre signĂ© indique le signe. Si ce bit est Ă  1, alors le nombre est nĂ©gatif. Si vous dĂ©calez un nombre nĂ©gatif, les positions libĂ©rĂ©es ne sont pas remplies de zĂ©ros, mais plutĂŽt de uns, car le bit de signe doit ĂȘtre conservĂ©. Par exemple : 10100010 >> 2 = 11101000 Cela dit, Java possĂšde un opĂ©rateur de dĂ©calage vers la droite non signĂ© supplĂ©mentaire (>>>). Cet opĂ©rateur est analogue Ă  >>, mais lorsqu'il est dĂ©calĂ©, les positions vacantes sont remplies par 0, que l'opĂ©rande soit un nombre nĂ©gatif ou un nombre positif. Par exemple : 10100010 >>> 2 = 00101000 En savoir plus sur les opĂ©rations au niveau du bit ici . Explorer les questions et rĂ©ponses d'un entretien d'embauche pour un poste de dĂ©veloppeur Java.  Partie 2 - 2Vous pouvez prendre la mĂ©thode hash() dans HashMaps comme exemple de dĂ©calages au niveau des bits en Java. Cette mĂ©thode est utilisĂ©e pour dĂ©terminer le hashcode interne spĂ©cial de la clĂ© : Explorer les questions et rĂ©ponses d'un entretien d'embauche pour un poste de dĂ©veloppeur Java.  Partie 2 - 3Cette mĂ©thode vous permet de rĂ©partir uniformĂ©ment les donnĂ©es dans un HashMap, afin de minimiser le nombre de collisions.

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 ?

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

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

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

  4. 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Ă©).

  5. Ces cours sont faciles Ă  tester.

  6. 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 :
  1. 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.

  2. Les applications écrites en POO sont beaucoup plus faciles à modifier (lorsque les principes de conception sont correctement respectés).

  3. É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).

  4. Le principe d'encapsulation protÚge les données les plus critiques de l'utilisateur.

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

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

  7. Prolonger une demande est plus simple qu’avec une approche procĂ©durale.

  8. 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 :
  1. La POO nĂ©cessite beaucoup de connaissances thĂ©oriques qu’il faut maĂźtriser avant de pouvoir Ă©crire quoi que ce soit.

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

  3. La POO réduit légÚrement les performances d'un programme en raison de la complexité accrue du systÚme.

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

  5. 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.
Polymorphisme dynamique, ou liaison tardive :
  • 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.

19. Fournir une définition du principe d'abstraction en POO

En POO, l'abstraction est un moyen d'isoler un ensemble de caractĂ©ristiques significatives d'un objet, tout en excluant les dĂ©tails insignifiants. Autrement dit, lors de la conception d'un programme avec une approche POO, vous vous concentrez sur des modĂšles gĂ©nĂ©raux, sans entrer dans les dĂ©tails de leur mise en Ɠuvre. En Java, l'abstraction est rĂ©alisĂ©e via des interfaces . Par exemple, vous avez une voiture et ce sera une interface. Et les diffĂ©rentes interactions avec celui-ci — par exemple, le dĂ©marrage du moteur, le changement de vitesse — sont des fonctions que nous utilisons sans entrer dans les dĂ©tails de mise en Ɠuvre. En effet, lorsque vous conduisez, vous ne pensez pas exactement Ă  la maniĂšre dont la boĂźte de vitesses remplit sa fonction, ni Ă  la maniĂšre dont la clĂ© dĂ©marre le moteur, ni Ă  la maniĂšre exacte dont le volant fait tourner les roues. Et si vous remplacez l'implĂ©mentation de certaines fonctionnalitĂ©s (par exemple, le moteur), vous ne le remarquerez peut-ĂȘtre mĂȘme pas. Cela n'a pas d'importance pour vous : vous n'entrez pas dans les dĂ©tails de la mise en Ɠuvre. Ce qui vous importe, c'est que l'action soit rĂ©alisĂ©e. Essentiellement, cela fait abstraction des dĂ©tails de mise en Ɠuvre. À ce stade, nous nous arrĂȘterons aujourd’hui : Ă  suivre !
Commentaires
  • Populaires
  • Nouveau
  • Anciennes
Tu dois ĂȘtre connectĂ©(e) pour laisser un commentaire
Cette page ne comporte pas encore de commentaires