Questions d’entretien d’embauche sur Java

Questions d’entretien pour développeurs Java

Généralement, lorsque l’on parle de préparation pour un entretien d’embauche de développeur Java, l’accent est mis sur le point de vue de la personne recrutée. Les candidats veulent savoir à quels types de questions ils doivent s’attendre afin de se préparer au mieux. Pourtant, en prenant un angle différent, on peut se demander: quelles questions un recruteur à la recherche d’un développeur Java doit-il poser aux candidats afin d’évaluer au mieux leurs compétences ?

Dans une entreprise développant des logiciels, que le langage de programmation java ou la programmation orientée objet en général soit un standard ou non, il est facile de trouver des questions de programmation et leurs réponses . Il est chose aisée d’utiliser Google, par exemple, pour rechercher la syntaxe du langage afin de faciliter la rédaction d’un entretien d’embauche sur java. Cependant, que se passe-t-il dans les cas où l’entreprise doit engager un contractuel pour un projet donné? De même, qu’advient-il si l’équipe existante n’est pas suffisamment qualifiée sur la question et s’agrandit pour inclure ses logiciels internes ?

Le but de cet article est d’aider à préparer le recruteur, quelle que soit son expérience avec java. Déterminer quel candidat parmi tant d’autres a offert la meilleure performance lors d’un entretien sur java n’est pas une tâche facile. En même temps, ce candidat parfait ne sera pas trouvé à l’aide de questions d’entretien purement liées au code. La programmation est souvent une question de logique, par opposition à la syntaxe, et ce serait une grave erreur de pénaliser trop lourdement les candidats parce qu’ils ne sont pas entièrement familiers avec quelque chose qui peut facilement être recherché à l’aide de Google.

Cela dit, il est important de se rappeler que l’entretien doit aboutir, en effet, à un poste de développeur Java. Le candidat doit connaître l’environnement d’exécution Java (JRE), la machine virtuelle Java (JVM) et le kit de développement Java (JDK), etc. Les bibliothèques couramment utilisées telles que java lang, java util ne devraient faire aucun mystère pour eux. De même, alors qu’elle n’est plus utilisée, la bibliothèque Swing devrait au moins leur être familière alors qu’il est acceptable de ne pas connaître la bibliothèque Awt, qui est totalement obsolète. Enfin, les candidats peuvent ne pas avoir une grande expérience, mais ils doivent au moins être au courant de l’existence de frameworks et d’autres technologies telles que Spring framework, JavaServer Pages (JSP), ainsi que Java Database Connectivity (JDBC).

Les questions d’entretien sur Java doivent être précises à certains égards, mais générales à d’autres. Par exemple, est-il nécessaire d’inclure des questions d’entrevue spécifiques à JDBC ? C’est peu probable. Cependant, un candidat doit absolument savoir ce qu’est une interface de liste.

Avec tant de prérequis parfois contradictoires, comment trouver le candidat idéal ? La réponse repose sur un vaste ensemble de questions d’entretien qui couvrent le sujet plusieurs angles différents. Cet article vise à répondre à ces préoccupations de recruteur, en fournissant des questions d’entretien sur Java, la ou les bonnes réponses, ainsi que la justification de chaque question.

Questions de programmation et leurs réponses

Cet article contient 14 questions d’entretien et leurs réponses. Les 5 premières sont au niveau débutant, tandis que les autres varient à la fois en termes de sujet et de niveau de difficulté. Un score parfait ne sera pas nécessairement obtenu en répondant à chaque question parfaitement. Au contraire, la discussion sur les solutions donnera le meilleur indicateur à la fois de la capacité et de l’expérience.

Questions de programmation Java niveau débutant

Le code Java fournit des méthodes de classes avec des spécificateurs d’accès publics et privés. Quelle est la différence entre ces deux modificateurs ?

Justification

Dans la programmation orientée objet, il est courant de limiter la portée des variables et des fonctions à des classes spécifiques dans une hiérarchie de classes. Ceci est réalisé à l’aide de différents spécificateurs d’accès, et connaître la différence entre ces composants fondamentaux est une question d’entretien java très pertinente.
En Java, les classes peuvent être uniquement déclarées publiques, ou bien pas du tout – alors que les fonctions membres ont quatre modificateurs différents – c’est donc un sujet difficile pour les débutants.

Bonne réponse

Un spécificateur d’accès public ordonne que la méthode soit accessible à la fois à l’intérieur et à l’extérieur de la classe. Ceci est vrai tant que la classe elle-même est déclarée publique, ou que la classe appelante est dans le même package. Si la classe ne spécifie pas de modificateur, elle est supposée avoir un accès par défaut (package), et les déclarations de ses méthodes ne l’écrasent pas.

Un spécificateur d’accès privé indique que la méthode doit être accessible uniquement à l’intérieur de la classe.

Bonus

Si le candidat sait qu’il y a aussi des spécificateurs pour protected et package (par défaut), on peut en déduire qu’il possède une bonne compréhension du sujet.

Mauvaise réponse

Si le candidat ne connaît pas la différence entre public et private, cela indique un manque d’expérience en Java et dans d’autres langages orientés objet tels que C+++. Si la réponse est correcte, mais qu’il n’est pas fait mention du fait que le modificateur de classe l’emporte sur les méthodes, il devrait être pénalisé.

2 – Considérons le code suivant qui contient une classe, une variable statique et une méthode publique. Combien de bites ont été prises de chaque pomme ?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Apple {
 
    static int bites = 0;
 
    public void takeBite() {
        bites++;
    }
 
    public static void main(String[] args) {
        // Instantiate red and green apples for our example public class
        Apple macintosh = new Apple();
        Apple grannySmith = new Apple();
 
        // Take a bite out of each of the two apples
        macintosh.takeBite();
        grannySmith.takeBite();
 
        // Display the contents of each class
        System.out.println("The Macintosh apple has " + macintosh.bites + " bite(s) out of it.");
        System.out.println("The Granny Smith apple has " + grannySmith.bites + " bite(s) out of it.");
    }
}

Justification

Les variables statiques sont une caractéristique de java qui est utilisée régulièrement par les développeurs. Comme c’est le cas pour les variables globales, il est important pour les programmeurs de comprendre la portée de ces objets afin d’éviter les effets secondaires involontaires et autres erreurs.
Non déclaration d’une variable: cela permet d’éviter de mal taper le nom d’une variable car la variable mal tapée apparaîtra comme une nouvelle variable non déclarée.

Bonne réponse

La classe Apple partage la variable statique, bites, entre toutes ses instances. Par conséquent, lorsque la méthode takeBite() est appelée sur chacune des instances, la variable commune est mise à jour. Le résultat final est:

The Macintosh apple has 2 bite(s) out of it. 
The Granny Smith apple has 2 bite(s) out of it.

Mauvaise réponse

Si le candidat répond que chacune des deux instances a une seule bite, cela indique un manque d’expérience avec les variables statiques. Bien qu’il s’agisse d’un sujet trivial qui s’apprend facilement, cela reste un sujet que l’on rencontre fréquemment. Le fait de ne pas en avoir connaissance indique que le candidat manque d’expérience pratique du langage.

2 – Qu’est-ce qu’une exception ? Décrivez brièvement les deux types d’exception utilisés dans le codage java.

Justification

Les exceptions sont des événements inattendus qui surviennent au moment de l’exécution et qui diffèrent des erreurs dans la mesure où il est généralement aisé de les « rattraper ». Les erreurs, par contre, indiquent généralement un problème plus grave. La gestion des exceptions est très courante et doit être comprise, au moins à un niveau de base, par tous les programmeurs java.

Bonne réponse

Les deux types d’exceptions dans java sont les exceptions vérifiées et les exceptions non-vérifiées.

Une exception vérifiée est une exception qui est « vérifiée » au moment de la compilation. Lorsqu’il y a du code dans une méthode qui « lève » une exception vérifiée, la méthode est nécessaire pour l’acquitter. Ceci peut être accompli soit en gérant l’exception avec un bloc try/catch, soit en la spécifiant à l’aide du mot-clé throws. Une exception non-vérifiée est une exception qui n’est pas vérifiée au moment de la compilation. C’est au programmeur de spécifier ce type d’exception. En revanche, toutes les exceptions en C+++ sont non-vérifiées.

Bonus

Dans java, toutes les exceptions des classes Error et RuntimeException sont décochées. Tout le reste sous Throwable est vérifié. Si la personne interrogée soulève ce point particulier, elle démontre une compréhension profonde de la question.

Mauvaise réponse

Si le candidat n’est pas au courant des exceptions, il lui manque une partie essentielle du langage qui est responsable du contrôle de l’exécution. Cette fonctionnalité représente un véritable fond en avant par rapport à des langages tels que C (qui ne supporte pas la gestion des exceptions). Bien qu’elles ne soient pas absolument nécessaire, les exceptions sont extrêmement utiles au quotidien du fait de leurs nombreux avantages.

4 – Que sont les classes d’emballage (aussi appelées classes d’enveloppe ou wrapper classes)? Donnez des exemples de deux d’entre elles et leur primitif correspondant. Comment chacun se rapporte-t-il à un objet ?

Justification

Les classes d’emballage sont fondamentales en programmation java. En fait, leur existence implique que java n’est pas 100% orienté objet (bonus au candidat qui le signale!). C’est le cas parce que java contient 8 types de données primitives qui ne sont pas, par définition, des objets.

Bonne réponse

Une classe d’emballage est une classe qui contient une variable qui est un type de données primitives, et qui enveloppe la primitive pour fournir une fonctionnalité d’interaction avec elle. En fait, on peut dire qu’il transforme le primitif en objet. Ceci est utile, par exemple, lorsqu’une méthode vise au transfert d’un objet. La classe d’emballage est valide, alors que le type de données primitif ne l’est pas. Le candidat doit être capable de nommer au moins deux des paires suivantes :

Primitive Classe d’emballage
boolean Boolean
byte Byte
char Char
double Double
float Float
int Int
long Long
short Short

Mauvaise réponse

Les classes d’emballage sont définies en java.lang, et requises car il existe de nombreuses classes qui supportent uniquement les objets. Le fait de ne pas connaître ces classes d’emballage, ou de ne pas savoir pourquoi elles seraient utilisées, apparaît comme une grave lacune de la part du candidat.

5 – Définissez les termes suivants qui sont communs à la programmation java

  1. Classe abstraite
  2. Ramasse-miettes (aussi appelé récupérateur de mémoire, glaneur de cellules, garbage collector ou garbage collection)
  3. Autoboxing
  4. Sérialisation

Justification

Cette liste inclut les termes qui sont utilisés dans java, ainsi que dans d’autres languages. Les questions d’entretien pour les programmeurs expérimentés incluent de telles définitions parce qu’elles testent leurs connaissances de manière approfondie et leur capacité à distinguer des langages ayant des concepts similaires, mais néanmoins pas identiques.

Bonne réponse

  1. Une classe abstraite est utilisée comme classe de base pour les sous-classes qui vont étendre ou écraser ses méthodes. Prenons l’exemple d’une classe « Shape ». Une forme peut contenir un certain nombre de côtés, de faces ou même de dimensions. Prise isolément, une « Shape » est peu utile. D’autre part, si cette classe abstraite sera utilisée comme classe de base pour un « Square », un « Triangle », ou un autre type de polygone, elle peut être utile quand placée au sommet de la hiérarchie des classes.
    – Il n’est pas possible d’instancier une classe abstraite.
    – Elle peut contenir des méthodes abstraites, mais ce n’est pas obligatoire.
    – Subclasses of the abstract class must implement all of the abstract methods, unless it is also an abstract class. It is not possible to instantiate an abstract class.

    Ne pas être parfaitement calé à propos classes abstraites n’est pas éliminatoire, bien qu’elles seront très probablement rencontrées lors de la maintenance ou du débogage d’une base de code existante.
  2. La garbage collection (effectuée par le garbage collector ou ramasse-miettes) est le processus de détection et de suppression des objets en mémoire qui ne sont plus utilisés ou référencés. En java, le ramassage des miettes est automatique, mais il peut aussi être demandé.

    Les commandes System.gc() et Runtime.gc() indiqueront au ramasse-miettes qu’il doit s’exécuter, bien que cela ne soit pas garanti.

    Les fils d’exécution sont mis en pause pendant le ramassage des ordures. Cela ralentit nécessairement l’exécution, ce qui signifie que dans les applications réactives, le ramassage des miettes doit être réduit au minimum. La connaissance du ramasseur de miettes n’est pas indispensable, surtout pour un programmeur débutant. Il est à noter, cependant, que lorsqu’on vient d’un langage comme C, où toute la mémoire est gérée manuellement, le développeur doit être au courant de l’existence de cette fonctionnalité.
  3. L’Autoboxing est l’emballage automatique d’un type primitif, comme discuté à la question #4. Par exemple, il convertira automatiquement un nombre de type float (type primitif) en Float (classe d’emballage). Le contraire de cela est le déballage, lors duquel type primitif est extrait de la classe d’emballage. Cette notion est habituellement familière aux bons développeurs java.
  4. La sérialisation fait référence à l’encodage d’objets en mémoire dans un flux d’octets qui peuvent être facilement stockés ou transmis. Le contraire est la désérialisation, qui reconstruit les objets à partir d’un flux d’octets. Il existe différentes approches pour réaliser la sérialisation. Deux méthodes courantes sont la conversion de l’objet en XML (eXtensible Markup Language), ou JSON (JavaScript Object Notation). Ce sont des types de fichiers bien connus, chacun d’entre eux étant largement pris en charge. Java supporte également la sérialisation comme partie intégrante du langage. Le langage inclut l’interface sérialisable, qui peut être utilisée à la fois pour la sérialisation et la désérialisation. La méthode writeObject() est utilisée pour encoder les données, tandis que la méthode readObject() est utilisée pour reconstruire les objets.

Questions de programmation Java de niveau variable

6 – Java définit une classe String pour représenter des tableaux de caractères. Répondez aux questions suivantes :

  1. Après la création d’une chaîne de caractères, est-il possible de la modifier? Prenez en considération l’extrait de code ci-dessous:
    1
    public static void main(String[] args) { String name = "James gosling"; // I want to change the 'g' to a 'G'. // Will this work at compile time? name.charAt(6) = 'G'; // Print with the standard system println to see “James Gosling” System.out.println(name); }

    Est-ce que ça va fonctionner? Si ce n’est pas le cas, quels changements seraient nécessaires afin d’obtenir la chaîne de caractères désirée ?
  2. La classe String possède plus d’un comparateur. Considérez l’extrait de code suivant :
    1
    public static void main(String[] args) { // This program received 2 arguments. We want to // determine if those two strings are equal. // Compare the first argument to the second argument boolean compareResult = (XXX); if (compareResult) { System.out.println("The Strings are the same."); } else { System.out.println("The Strings are not the same."); } // Print the main string args System.out.println(args[0]); System.out.println(args[1]); }

    – Par quoi faut-il remplacer le « XXX » pour comparer les deux string args principales ? Si les arguments sont : « Sun Microsystems » et « Sun microsystems », quel sera le résultat de l’exécution ? Existe-t-il un moyen de garantir qu’il les déclarera comme identiques ?
    – Si les arguments sont à la place : « Sun microsystem » et « Sun microsystems », quel sera le résultat de l’exécution ?
  3. Qu’est-ce que la table des constantes de Java ? Est-ce qu’il réside dans la pile (stack memory ?

Justification

L’utilisation de représentations de chaînes de caractères est courante dans de nombreux langages, et Java ne fait pas exception. Il est important de comprendre comment les chaînes de caractères sont créées, analysées, imprimées et manipulées. En tant que sujet important, il s’agit d’une question d’entretien importante pour recruter des développeurs java qualifiés.

Bonnes réponses

  1. Non, cela échouera au moment de la compilation car il n’est pas possible de modifier une chaîne une fois qu’elle a été initialisée. Cette propriété est dite immuable. Pour que cela fonctionne, il faudrait recréer la chaîne de caractères contenant « James gosling ». Une approche consiste à utiliser un tableau de caractères intermédiaire (en appelant la méthode toCharArray() sur le « name »), en remplaçant le « g » par la lettre majuscule, puis en recréant la chaîne avant de l’imprimer. Un bonus pour le candidat qui signale que la fonction replace(…) existe pour remplacer des caractères, mais ne peut pas être utilisée car toutes les instances de’g’ en minuscules seraient remplacées.
  2. Le comparateur exact dans cet exemple est soit equals(…), soit equalsIgnoreCase(…). Le type de retour de ces deux méthodes est une valeur booléenne. Si la personne interrogée répond compareTo(…) ou compareToIgnoreCase(…) alors la réponse est acceptable, bien que le type de retour de ces méthodes soit un int, donc techniquement incorrect. Cependant, cela démontre tout de même une certaine connaissance du langage.

    Dans le premier exemple, les chaînes sont identiques sous equalsIgnoreCase(…), mais différentes sous equals(…). Dans le deuxième exemple, il y a un’s’ de suivi, ce qui rend les chaînes de caractères différentes, quel que soit le cas.
  3. Le pool de chaînes constantes Java est une zone du tas (Heap memory), donc pas dans la pile) où les chaînes de caractères sont stockées. Cette approche est à l’origine de la raison pour laquelle les chaînes de caractères sont immuables en java.

    Exemple:
    string x = “main string”;
    string y = “virtual machine”;
    string z = “main string”; 

    Les trois chaînes de caractères ci-dessus sont stockées dans le pool de chaînes de caractères, mais la partie intéressante est l’efficacité. x et y pointent tous les deux vers la même zone à l’intérieur du pool de chaînes de caractères, ne nécessitant donc pas de duplication de l’espace. Sachant cela, il devrait être clair que la modification de la valeur de x n’est pas autorisée parce qu’elle aurait l’effet secondaire involontaire de changer z.

7 – Quelles sont les différences entre la mémoire de pile et l’espace de tas

Justification

Afin d’améliorer l’efficacité, la JVM organise la mémoire pour les applications à exécuter. Elle crée de l’espace de pile et de l’espace de tas, dont chacun est utilisé par différentes opérations. Comprendre l’allocation de mémoire à ce niveau peut conduire à un ramassage des miettes plus prévisible et, en fin de compte, à une efficacité accrue.

Bonne réponse

La mémoire de pile est utilisée pour l’allocation de mémoire statique, comme les valeurs primitives à l’intérieur d’une méthode. Il est toujours utilisé pour l’exécution d’un thread. La pile s’agrandit lorsque les méthodes sont appelées et rétrécit lorsqu’elles reviennent. Si la mémoire allouée à la pile est dépassée, l’exception java.lang.StackOverFlowError est levée.

La mémoire de tas est utilisée pour l’allocation dynamique de mémoire, comme les objets java. Plus précisément, l’objet est stocké dans le tas, tandis que la référence à l’objet est stockée dans la pile. Les classes JRE sont également stockées dans le tas au moment de l’exécution. L’accès aux données dans le tas est plus lent que dans la mémoire de pile. Le tas nécessite l’action du ramasse-miettes afin de libérer les objets inutilisés. Si la mémoire allouée au tas est dépassée, l’exception java.lang.outOfMemoryError est levée.

Mauvaise réponse

Le fait de ne jamais avoir entendu parler de la pile ou du tas indiquerait une connaissance superficielle du langage de programmation java. De plus, la terminologie est typique d’une culture générale de programmation. Une bonne compréhension de ces concepts est indispensable pour diagnostiquer les erreurs liées à la mémoire, comme un débordement de pile causé par une fonction récursive qui se comporte mal.

 

Justification

Dans la conception orientée objet, il y a souvent confusion sur le placement des classes dans la hiérarchie. Les classes imbriquées sont relativement rares par rapport aux sous-classes, mais leur utilisation est bénéfique dans de nombreuses situations. La connaissance de leur existence et de leur utilisation devrait être considérée comme un atout.

Bonne réponse

Une sous-classe est une sous-classe qui étend une autre classe, et est souvent une spécialisation de l’original. Les sous-classes héritent des membres publics et des membres protégés de leur superclasse. Les sous-classes peuvent être instanciées indépendamment de la superclasse, et en fait, c’est toujours le cas lorsque la superclasse est une classe abstraite.

Une classe imbriquée est une classe au sein d’une classe, qui dans certains cas est une classe interne. La portée de la classe intérieure inclut tous les membres de sa classe extérieure, ce qui lui donne accès à ces variables et méthodes. Parce que le corps existe entièrement à l’intérieur de la classe qui l’entoure, il ne peut pas être instancié indépendamment, sans lui.

L’utilisation d’une classe interne peut améliorer la conception orientée objet en organisant davantage le code. Le but est limité en ce qu’il existe pour servir son enclosing class. Si la classe interne offre des fonctionnalités utiles à plus grande échelle, il serait plus logique de l’avoir comme classe de niveau supérieur. Les classes internes sont couramment utilisées comme fonctions de rappel pour les composants de l’interface graphique.

Bonus

Il existe deux types de classes imbriquées. Plus précisément, il existe une classe imbriquée statique, qui n’a pas directement accès aux autres membres de la classe qui l’entoure. Ils ne sont pas souvent utilisés, c’est pourquoi les connaître mérite un bonus, et ne pas les connaître mérite une pénalité L’autre type est une classe imbriquée non statique, qui est la version appelée classe interne. Ceux-ci ont en effet accès à tous les membres de la classe qui les entoure, y compris les méthodes privées.

Mauvaise réponse

Il doit être toléré que le candidat n’ait jamais eu à utiliser une classe imbriquée. Le concept est simple. Les classes intérieures rendent souvent le code plus élégant et plus facile à entretenir, même si certains concepteurs considèrent que c’est une question de style. Les sous-classes, d’autre part, sont un composant fondamental de la programmation orientée objet que tout développeur java doit connaître. Le fait de ne pas pouvoir discuter facilement des sous-classes au sein d’une hiérarchie de classes est un sérieux signal d’alarme quant aux compétences de ce candidat.

9 – Deux classes de collection qui sont disponibles dans la programmation java sont le tableau et la liste. En quoi les méthodes diffèrent-elles entre ces deux conteneurs et dans quelles circonstances choisiriez-vous l’un plutôt que l’autre ?

Justification

L’utilisation de conteneurs est courante en Java et dans d’autres langages de programmation. La liste est une structure de données dynamique, tandis que le tableau est statique. Il est important de reconnaître que chacune d’entre elles convient mieux à certaines applications et que, par conséquent, le candidat doit bien les connaître. Avoir une connaissance approfondie des types de données disponibles et des classes de conteneurs permettra en fin de compte d’économiser du temps quand sera venue l’heure de programmer.

Bonne réponse

Tableau

  1. Les tableaux sont de taille statique, donc ils ne peuvent pas grandir ou rétrécir en termes de nombre d’éléments. Cela signifie qu’il existe des méthodes pour accéder aux éléments et les modifier, mais pas pour les insérer ou les supprimer.
  2. Java fournit des méthodes pour effectuer une recherche ou un tri binaire sur un tableau. De plus, un tableau peut être initialisé en utilisant la méthode fill(), ou comparé en utilisant le comparateur equals().
  3. La taille d’un tableau est définie lors de sa création.
  4. L’accès aléatoire d’un élément dans un tableau est très efficace.
  5. Les tableaux sont parfaitement appropriés pour un ensemble d’éléments de longueur définie.
  6. Lorsque tous les éléments sont du même type, par exemple :
1
2
3
int[] interviewArray = new int[5];
or
int[] arrayForInterview = {3, 1, 4, 1, 5};

Ces deux tableaux contiennent cinq entiers.

Vector

Les candidats doivent savoir quand il est approprié et possible d’utiliser ces mots-clés. En particulier, ils doivent savoir que async ne peut être placé qu’avant le mot-clé de la fonction sur une définition de fonction. Ceci marque la fonction de retour d’une promesse (ou Promise). Le mot-clé en attente ne peut être utilisé qu’à l’intérieur d’une telle fonction asynchrone et doit être placé avant un appel à une fonction qui retournera une promesse.

  1. Les éléments d’une liste peuvent être ajoutés ou supprimés, ce qui signifie que la taille de la liste peut changer. Les méthodes permettent de nombreux types de manipulations, y compris l’insertion ou la suppression dans un index spécifique. Les portées peuvent également être manipulées.
  2. La liste est une interface, donc quand on manipule une liste, une classe réelle, habituellement ArrayList, est utilisée derrière la scène.
  3. Une liste repose sur les méthodes de tri des Collections, telles que Collections.sort().
  4. Les méthodes de recherche contains(), indexOf(), et lastIndexOf() sont des exemples qui peuvent être utilisés pour rechercher les éléments. Cependant, pour effectuer une recherche binaire, il faut appeler la méthode la plus générale : Collections.binarySearch(…)
  5. Les listes peuvent stocker des objets de type mixte, par exemple :
1
2
3
4
List interviewList = new ArrayList();
interviewList.add(3);
interviewList.add(1415);
interviewList.add(“Pi”);

Bonus

Les tableaux peuvent stocker des objets, il y a donc une solution de contournement disponible pour ceux qui ont tendance à mélanger des types dans un tableau. En outre, le candidat doit être valorisé pour savoir que les listes sont un remplacement pour les vecteurs qui ne sont plus couramment utilisés en Java. La raison en est la concomitance et la synchronisation des opérations. Il est clair qu’une explication plus détaillée dépasse la portée initiale de cette question – cependant, un candidat qui va plus loin en soulignant ces problématiques possède probablement une connaissance avancée du sujet.

Mauvaise réponse

Les tableaux et les listes, parmi d’autres classes et interfaces intégrées, y compris les collections, sont très courants dans la programmation java et le développement d’applications. Un candidat qui n’est pas à l’aise avec ces caractéristiques manque certainement d’expérience avec le langage.

10 – Contrairement au C+++, Java ne supporte pas l’héritage multiple. Comment la programmation avec une interface apportera-t-elle une réponse à ce problème ? Une interface fait-elle partie de la hiérarchie de classe ?

Justification

Bien qu’il y ait des points communs entre les langages que connaissent bien les développeurs, il existe également des distinctions qui aident à les définir. Dans un entretien d’embauche d’un développeur java, il y aura des questions java de base qui aideront à évaluer dans quelle mesure le candidat connaît bien les spécificités du langage de programmation java. Étant donné la question du « problème du diamant » en C++, il est utile de tester les connaissances du candidat d’un point de vue java.

Bonne réponse

Une interface est similaire à une classe en ce sens qu’elle peut contenir différents types de méthodes, mais différente parce qu’elle ne contient pas l’état. Les interfaces sont intrinsèquement abstraites et leurs méthodes doivent être implémentées par une classe. L’interface n’est pas instanciée – elle est implémentée. Contrairement au C++, une classe ne peut s’étendre qu’un seul parent (c’est-à-dire qu’elle ne peut avoir qu’une seule superclasse). Une interface, par contre, est capable d’étendre plus d’une interface mère. Par exemple :

1
2
3
4
5
6
7
8
public interface CheckerBoard {
    public void setSize(int rowCount, int columnCount);
}
public interface Game {
public void setNumberOfPlayers();
public void play();
}
public interface ChessGame extends CheckerBoard, Game {}

Dans cet exemple, l’interface ChessGame hérite à la fois de CheckerBoard et de Game.

Mauvaise réponse

Si la personne interrogée ne sait pas ce qu’est l’héritage multiple, cela suggère un manque d’expérience en conception orientée objet. Ce n’est pas essentiel pour toutes les applications, mais il est important de reconnaître que java est intrinsèquement OO.

11 – Qu’est-ce que la machine virtuelle Java ? Quel est l’objectif principal et avec quel type de code fonctionne-t-il ?

Justification

Aucun entretien d’embauche autour de Java ne serait complet sans une question sur le thème de la machine virtuelle. La JVM est un composant clé de Java, et les programmeurs java l’apprennent très tôt. Bien que la JVM soit capable d’exécuter le bytecode générée par d’autres langages, tels que JRuby et Jython, cela n’enlève rien au fait qu’il est essentiel pour java lui-même.

Bonne réponse

La JVM est une machine virtuelle qui permet à l’ordinateur d’exécuter des programmes Java qui ont été compilés en bytecode. Le bytecode est indépendant de la plate-forme et fonctionne sur n’importe quel ordinateur qui héberge une JVM. Il inclut un compilateur juste-à-temps (JIT) qui convertit le bytecode en instructions en langage machine, permettant aux applications de s’exécuter aussi rapidement qu’un exécutable native.

Mauvaise réponse

Le fait de ne pas connaître la JVM indique probablement un manque d’expérience du langage.

12 – 12 – Que sont les méthodes finales et les classes finales? Une classe abstraite soutiendra-t-elle les méthodes finales ?

Justification

Le mot-clé final est commun et devrait être bien compris par les programmeurs java. Au cours de la phase de conception de l’OO, une décision est normalement prise quant à savoir si les classes doivent être extensibles. Dans le cas contraire, elles sont marquées comme définitives afin de limiter les effets secondaires potentiels des sous-classes qui n’ont pas été envisagées. C’est une caractéristique importante qui devrait être systématiquement utilisée pour un code plus robuste et plus facile à maintenir.

Bonne réponse

Une méthode déclarée avec le mot-clé final ne peut pas être écrasée dans les sous-classes. Cette méthode est utilisée dans les hiérarchies où la mise en œuvre de la méthode doit être cohérente tout au long du processus. La déclaration finale d’une classe exclut complètement la sous-classification. Oui, il est bel et bien possible d’inclure des méthodes finales dans une classe abstraite. Ceci garantit que les sous-classes ne peuvent pas remplacer la méthode.

Mauvaise réponse

Si le candidat n’est pas familier avec le mot-clé final, qu’il soit utilisé au niveau de la classe ou de la méthode, cela suggère une probable méconnaissance du langage. Même pour les programmeurs inexpérimentés qui ont participé à la conception orientée objet, le concept d’une classe final doit être familier.

13 – La programmation Java permet de créer un thread (ou “fil”) de différentes manières. Quelles sont-elles et quelle est la méthode préférable? Justifiez votre réponse.

Justification

Contrairement au C++, java contient un support intégré pour le multithreading. Il s’agit d’une fonctionnalité riche et puissante qui est pertinente dans de nombreuses applications. À ce titre, le candidat doit être familier avec ces notions de base.

Bonne réponse

Que se passe-t-il dans le cas où reduce est appelé sur un tableau vide sans fournir la valeur initiale optionnelle de l’accumulateur ?

1
2
3
4
5
public class JavaInterviewClass implements Runnable {
    public void run() {
    System.out.println(“My example public class prints this line from a thread.”);
    }
}  

Pour exécuter la méthode run(), passez une instance de la classe dans un thread, comme ci-dessous:

1
2
Thread interviewThread = new Thread(new JavaInterviewClass ());
interviewThread.start();

La deuxième façon de créer un thread est d’étendre la classe Thread. La sous-classe remplacera la méthode run(). Ensuite, créez simplement une instance de la classe.

1
2
3
4
5
public class JavaInterviewClass extends Thread {
    public void run() {
    System.out.println(“My example public class extends the Thread class.”);
    }
}

Pour exécuter le thread, instanciez simplement la classe et appelez start(), comme ci-dessous:

1
JavaInterviewClass myInterview = new JavaInterviewClass (); myInterview.start();

Bonus

Bien que l’implémentation de l’interface exécutable et l’extension de la classe Thread sont deux façons populaires de créer un thread, il est également possible d’utiliser le framework Executor. Cela permet de travailler directement avec des threads, mais est moins connu. Il inclut des méthodes telles que newSingleThreadExecutor(), newFixedThreadPool(), et submit() pour créer une tâche à exécuter. La connaissance de l’utilisation du framework Executor induit que le candidat est très à l’aise avec la création et l’utilisation de threads en java.

Mauvaise réponse

Si le candidat n’est pas à l’aise avec l’utilisation des threads, il ignore une caractéristique centrale et significative du langage. C’est important parce que comprendre le multithreading est plus qu’une simple recherche syntaxique pour quelques commandes. Il s’agit plutôt d’une approche qui devrait être prise en considération au moment de la conception et de l’élaboration d’une application.

14 – Le code Java prend en charge de manière intégrée la concomitance dans sa classe Thread. La simultanéité a ses travers tels que la situation de deadlock et la situation de compétition. Décrivez brièvement les variables atomiques en Java et comment elles sont utilisées.
Ensuite, étant donné que la méthode start() est utilisée pour créer une pile d’appels séparée avant que la méthode run() soit utilisée pour exécuter un thread, que font les méthodes yield(), sleep() et join() ?

Justification

La prise en charge du multithreading par Java peut entraîner des problèmes liés à la concomitance. Les connaissances du candidat sur ces questions doivent être évaluées et prises en compte.

Bonne réponse

  1. Une variable atomique est une variable « mise à jour atomiquement », ce qui signifie que l’intégrité des données est assurée par l’utilisation d’algorithmes non bloquants. Cette fonctionnalité est généralement implémentée au niveau du code machine. Java supporte plusieurs variables atomiques, le plus souvent AtomicBoolean, AtomicInteger, AtomicLong et AtomicReference. Il y a aussi plusieurs méthodes qui supportent la récupération et la modification de ces variables, y compris get(), set(), lazySet(), compareAndSet(), et weakCompareAndSet(). Utilisées correctement, les variables atomiques peuvent être utilisées pour implémenter des méthodes sans fil (multithreading safe) qui traitent efficacement certains problèmes liés à la concurrence.
  2. yield() : Cette méthode informe l’environnement que le thread en cours n’est pas en train d’achever une tâche de haute priorité et qu’il est prêt à interrompre l’exécution. Si l’environnement sous-jacent prend en charge l’ordonnancement préemptif, il suspendra le thread s’il en existe un autre qui doit être exécuté. S’il n’y a pas de deuxième thread, ou une fois le deuxième thread terminé, le thread en cours va reprendre le contrôle et continuer à s’exécuter.
  3. sleep() : Cette méthode permet de mettre en veille ou en pause l’exécution du thread en cours pendant un nombre de millisecondes spécifié. Alternativement, un nombre spécifié de millisecondes et de nanosecondes combinées. Pendant que le thread en cours « dort », un autre thread s’exécute, sinon le CPU reste inactif. Sous réserve de la précision de l’horloge système et des minuteries, le thread reprendra le contrôle une fois le compte à rebours écoulé.
  4. join() : Cette méthode est utilisée pour joindre l’exécution de deux threads ensemble. Pour clarifier, si les appels du thread A rejoignent () sur le thread B, alors A va commencer à attendre. Une fois que B a terminé ou qu’une minuterie préétablie a expiré, A reprend le contrôle et continue l’exécution.

Mauvaise réponse

Connaître les threads Java, mais ne pas être conscient des problèmes liés à la concurrence peut conduire à de graves erreurs. La majorité des appareils, des ordinateurs de bureau aux appareils mobiles, prennent généralement en charge le multithreading et la concomitance. Il est important de comprendre l’utilisation correcte des threads, et d’être au courant des méthodes fournies par java pour les prendre en charge.

Conclusion

Les questions d’entretien d’embauche citées dans cet article sont utiles pour évaluer la compétence d’un programmeur Java. Il est important de se rappeler que les spécificités du langage peuvent être facilement référencées à l’aide d’une aide et d’une documentation en ligne sur le sujet des questions d’entretien à préparer pour un développeur Java. Les points subtils d’un langage ne sont pas aussi importants que la façon dont on applique sa logique. Cela dit, on s’attend à ce que les candidats à un tel poste connaissent la langue et n’aient pas besoin d’une formation approfondie avant que le travail opérationnel ne commence. Les compétences requises seront dictées par le projet à accomplir, et la qualité des réponses aux questions ci-dessus vous aidera à faire à choisir le meilleur candidat possible.