Introduction
Si vous passez un entretien pour un poste de programmation Java, vos compétences en codage seront probablement mises à l’épreuve. Que vous soyez débutant en Java ou un programmeur expert, cet article propose quelques questions d’entretien courantes sur Java ainsi que les réponses correspondantes pour vous aider à vous préparer.
1. Comment inverser une chaîne en Java?
Il n’y a pas de méthode utilitaire reverse()
dans la classe String
. Cependant, vous pouvez créer un tableau de caractères à partir de la chaîne, puis le parcourir de la fin au début. Vous pouvez ajouter les caractères à un objet StringBuilder et finalement retourner la chaîne inversée.
L’exemple de code suivant montre une façon d’inverser une chaîne:
public class StringPrograms {
public static void main(String[] args) {
String str = "123";
System.out.println(reverse(str));
}
public static String reverse(String in) {
if (in == null)
throw new IllegalArgumentException("Null is not valid input");
StringBuilder out = new StringBuilder();
char[] chars = in.toCharArray();
for (int i = chars.length - 1; i >= 0; i--)
out.append(chars[i]);
return out.toString();
}
}
Des points bonus pour ajouter une vérification de null
dans la méthode et utiliser StringBuilder
pour ajouter les caractères. Notez que l’indexation en Java commence à 0, vous devez donc commencer à chars.length - 1
dans la boucle for
.
2. Comment échanger deux nombres sans utiliser de variable temporaire en Java ?
Échanger des nombres sans utiliser de variable temporaire est un processus en trois étapes qui est mieux visualisé dans le code :
b = b + a; // now b is sum of both the numbers
a = b - a; // b - a = (b + a) - a = b (a is swapped)
b = b - a; // (b + a) - b = a (b is swapped)
L’exemple de code suivant montre une façon d’implémenter la méthode d’échange de nombres :
public class SwapNumbers {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a is " + a + " and b is " + b);
a = a + b;
b = a - b;
a = a - b;
System.out.println("After swapping, a is " + a + " and b is " + b);
}
}
La sortie montre que les valeurs entières sont échangées :
Outputa is 10 and b is 20
After swapping, a is 20 and b is 10
3. Écrivez un programme Java pour vérifier si une voyelle est présente dans une chaîne.
L’exemple de code suivant montre comment utiliser une expression régulière pour vérifier si la chaîne contient des voyelles :
public class StringContainsVowels {
public static void main(String[] args) {
System.out.println(stringContainsVowels("Hello")); // true
System.out.println(stringContainsVowels("TV")); // false
}
public static boolean stringContainsVowels(String input) {
return input.toLowerCase().matches(".*[aeiou].*");
}
}
4. Écrivez un programme Java pour vérifier si le nombre donné est un nombre premier.
Vous pouvez écrire un programme pour diviser le nombre donné n
par un nombre de 2 à n
/2 et vérifier le reste. Si le reste est 0, alors ce n’est pas un nombre premier. Le code d’exemple suivant montre une façon de vérifier si un nombre donné est premier :
public class PrimeNumberCheck {
public static void main(String[] args) {
System.out.println(isPrime(19)); // true
System.out.println(isPrime(49)); // false
}
public static boolean isPrime(int n) {
if (n == 0 || n == 1) {
return false;
}
if (n == 2) {
return true;
}
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
Bien que ce programme fonctionne, il n’est pas très efficace en termes de mémoire et de temps. Considérez que, pour un nombre donné N
, s’il existe un nombre premier M
entre 2
et √N
(racine carrée de N) qui le divise uniformément, alors N
n’est pas un nombre premier.
5. Écrivez un programme Java pour imprimer une séquence de Fibonacci en utilisant la récursivité.
A Fibonacci sequence is one in which each number is the sum of the two previous numbers. In this example, the sequence begins with 0
and 1
. The following example code shows how to use a for
loop to print a Fibonacci sequence:
public class PrintFibonacci {
public static void printFibonacciSequence(int count) {
int a = 0;
int b = 1;
int c = 1;
for (int i = 1; i <= count; i++) {
System.out.print(a + ", ");
a = b;
b = c;
c = a + b;
}
}
public static void main(String[] args) {
printFibonacciSequence(10);
}
}
Output0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
Vous pouvez également utiliser la récursivité pour imprimer une séquence de Fibonacci, car le nombre Fibonacci est généré en ajoutant les deux nombres précédents dans la séquence:
F(N) = F(N-1) + F(N-2)
La classe d’exemple suivante montre comment utiliser la récursivité pour calculer une séquence de Fibonacci de 10 nombres :
public class PrintFibonacciRecursive {
public static int fibonacci(int count) {
if (count <= 1)
return count;
return fibonacci(count - 1) + fibonacci(count - 2);
}
public static void main(String args[]) {
int seqLength = 10;
System.out.print("A Fibonacci sequence of " + seqLength + " numbers: ");
for (int i = 0; i < seqLength; i++) {
System.out.print(fibonacci(i) + " ");
}
}
}
OutputA Fibonacci sequence of 10 numbers: 0 1 1 2 3 5 8 13 21 34
6. Comment vérifier si une liste d’entiers ne contient que des nombres impairs en Java?
Vous pouvez utiliser une boucle for
et vérifier si chaque élément est impair:
public static boolean onlyOddNumbers(List<Integer> list) {
for (int i : list) {
if (i % 2 == 0)
return false;
}
return true;
}
Si la liste est grande, vous pouvez utiliser un flux parallèle pour un traitement plus rapide, comme le montre le code exemple suivant:
public static boolean onlyOddNumbers(List<Integer> list) {
return list
.parallelStream() // flux parallèle pour un traitement plus rapide
.anyMatch(x -> x % 2 != 0); // retourne dès que des éléments correspondent à la condition
}
Pour en savoir plus sur les mathématiques derrière la détermination si un entier est impair, référez-vous à l’opération modulo sur Wikipedia.
7. Comment vérifier si une chaîne de caractères est un palindrome en Java?
A palindrome string is the same string backwards or forwards. To check for a palindrome, you can reverse the input string and check if the result is equal to the input. The following example code shows how to use the String charAt(int index)
method to check for palindrome strings:
boolean checkPalindromeString(String input) {
boolean result = true;
int length = input.length();
for (int i = 0; i < length/2; i++) {
if (input.charAt(i) != input.charAt(length - i - 1)) {
result = false;
break;
}
}
return result;
}
8. Comment supprimer les espaces d’une chaîne de caractères en Java?
Le code d’exemple suivant montre une façon de supprimer les espaces d’une chaîne à l’aide de la méthode Character.isWhitespace()
:
String removeWhiteSpaces(String input) {
StringBuilder output = new StringBuilder();
char[] charArray = input.toCharArray();
for (char c : charArray) {
if (!Character.isWhitespace(c))
output.append(c);
}
return output.toString();
}
En savoir plus sur la suppression d’espaces et d’autres caractères d’une chaîne en Java.
9. Comment supprimer les espaces en début et en fin de chaîne en Java?
La classe String
contient deux méthodes pour supprimer les espaces en début et en fin de chaîne: trim()
et strip()
. La méthode strip()
a été ajoutée à la classe String
en Java 11. La méthode strip()
utilise la méthode Character.isWhitespace()
pour vérifier si le caractère est un espace. Cette méthode utilise des points de code Unicode, tandis que la méthode trim()
identifie tout caractère ayant une valeur de point de code inférieure ou égale à U+0020
comme un caractère d’espace.
La méthode strip()
est la méthode recommandée pour supprimer les espaces car elle utilise la norme Unicode. Le code d’exemple suivant montre comment utiliser la méthode strip()
pour supprimer les espaces:
String s = " abc def\t";
s = s.strip();
System.out.println(s);
Étant donné que String
est immuable, vous devez assigner la sortie de strip()
à la chaîne.
10. Comment trier un tableau en Java ?
La classe utilitaire Arrays
propose de nombreuses méthodes sort()
surchargées pour trier des tableaux, tant pour les tableaux de types primitifs que pour les tableaux d’objets. Si vous trie un tableau de types primitifs dans l’ordre naturel, vous pouvez utiliser la méthode Arrays.sort()
, comme illustré dans l’exemple suivant :
int[] array = {1, 2, 3, -1, -2, 4};
Arrays.sort(array);
System.out.println(Arrays.toString(array));
Cependant, si vous souhaitez trier un tableau d’objets, l’objet doit implémenter l’interface Comparable
. Si vous souhaitez spécifier les critères de tri, vous pouvez passer un Comparator
pour la logique de tri. En savoir plus sur Comparable et Comparator en Java.
11. Comment créer un scénario de deadlock de manière programmatique en Java ?
Le deadlock est une situation dans un environnement Java multi-thread où deux threads ou plus sont bloqués indéfiniment. La situation de deadlock se produit avec au moins deux threads. Le code exemple suivant crée un scénario de deadlock :
public class ThreadDeadlock {
public static void main(String[] args) throws InterruptedException {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
Thread t3 = new Thread(new SyncThread(obj3, obj1), "t3");
t1.start();
Thread.sleep(5000);
t2.start();
Thread.sleep(5000);
t3.start();
}
}
class SyncThread implements Runnable {
private Object obj1;
private Object obj2;
public SyncThread(Object o1, Object o2) {
this.obj1 = o1;
this.obj2 = o2;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " acquiring lock on " + obj1);
synchronized (obj1) {
System.out.println(name + " acquired lock on " + obj1);
work();
System.out.println(name + " acquiring lock on " + obj2);
synchronized (obj2) {
System.out.println(name + " acquired lock on " + obj2);
work();
}
System.out.println(name + " released lock on " + obj2);
}
System.out.println(name + " released lock on " + obj1);
System.out.println(name + " finished execution.");
}
private void work() {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Les trois threads seront en mesure d’acquérir un verrou sur le premier objet. Cependant, ils utilisent des ressources partagées et sont démarrés de telle manière qu’ils continueront à attendre indéfiniment pour acquérir le verrou sur le deuxième objet. Vous pouvez utiliser le vidage de thread Java pour détecter les impasses. En savoir plus sur les impasse en Java.
12. Comment pouvez-vous trouver le factoriel d’un entier en Java?
Le factoriel d’un entier est calculé en multipliant tous les nombres de 1 au nombre donné :
F(n) = F(1)*F(2)...F(n-1)*F(n)
L’exemple de code suivant montre comment utiliser la récursion pour trouver le factoriel d’un entier :
public static long factorial(long n) {
if (n == 1)
return 1;
else
return (n * factorial(n - 1));
}
13. Comment inversez-vous une liste chaînée en Java?
LinkedList descendingIterator()
renvoie un itérateur qui itère sur les éléments dans l’ordre inverse. L’exemple de code suivant montre comment utiliser cet itérateur pour créer une nouvelle liste chaînée avec les éléments répertoriés dans l’ordre inverse:
LinkedList<Integer> ll = new LinkedList<>();
ll.add(1);
ll.add(2);
ll.add(3);
System.out.println(ll);
LinkedList<Integer> ll1 = new LinkedList<>();
ll.descendingIterator().forEachRemaining(ll1::add);
System.out.println(ll1);
Apprenez-en davantage sur le renversement d’une liste chaînée d’un point de vue des structures de données et des algorithmes.
14. Comment implémenter une recherche binaire en Java?
Les éléments du tableau doivent être triés pour implémenter une recherche binaire. L’algorithme de recherche binaire est basé sur les conditions suivantes :
- Si la clé est inférieure à l’élément du milieu, alors vous devez désormais chercher uniquement dans la première moitié du tableau.
- Si la clé est supérieure à l’élément du milieu, alors vous devez chercher uniquement dans la deuxième moitié du tableau.
- Si la clé est égale à l’élément du milieu dans le tableau, alors la recherche se termine.
- Enfin, si la clé n’est pas trouvée dans tout le tableau, alors elle devrait retourner
-1
. Cela indique que l’élément n’est pas présent.
L’exemple de code suivant implémente une recherche binaire :
public static int binarySearch(int arr[], int low, int high, int key) {
int mid = (low + high) / 2;
while (low <= high) {
if (arr[mid] < key) {
low = mid + 1;
} else if (arr[mid] == key) {
return mid;
} else {
high = mid - 1;
}
mid = (low + high) / 2;
}
if (low > high) {
return -1;
}
return -1;
}
15. Écrivez un programme Java qui illustre le tri fusion.
Le tri fusion est l’un des algorithmes de tri les plus efficaces. Il repose sur le principe de « diviser pour régner ». Il est basé sur l’idée de diviser une liste en plusieurs sous-listes jusqu’à ce que chaque sous-liste ne contienne qu’un seul élément, puis de fusionner ces sous-listes de manière à obtenir une liste triée. Le code d’exemple suivant montre une façon d’utiliser le tri fusion :
public class MergeSort {
public static void main(String[] args) {
int[] arr = { 70, 50, 30, 10, 20, 40, 60 };
int[] merged = mergeSort(arr, 0, arr.length - 1);
for (int val : merged) {
System.out.print(val + " ");
}
}
public static int[] mergeTwoSortedArrays(int[] one, int[] two) {
int[] sorted = new int[one.length + two.length];
int i = 0;
int j = 0;
int k = 0;
while (i < one.length && j < two.length) {
if (one[i] < two[j]) {
sorted[k] = one[i];
k++;
i++;
} else {
sorted[k] = two[j];
k++;
j++;
}
}
if (i == one.length) {
while (j < two.length) {
sorted[k] = two[j];
k++;
j++;
}
}
if (j == two.length) {
while (i < one.length) {
sorted[k] = one[i];
k++;
i++;
}
}
return sorted;
}
public static int[] mergeSort(int[] arr, int lo, int hi) {
if (lo == hi) {
int[] br = new int[1];
br[0] = arr[lo];
return br;
}
int mid = (lo + hi) / 2;
int[] fh = mergeSort(arr, lo, mid);
int[] sh = mergeSort(arr, mid + 1, hi);
int[] merged = mergeTwoSortedArrays(fh, sh);
return merged;
}
}
16. Pouvez-vous créer une pyramide de caractères en Java?
Les programmes de motifs sont un sujet d’entretien très populaire. Ce type de question est utilisé pour comprendre les capacités de réflexion logique du candidat à l’entretien. Reportez-vous à Programmes de motifs de pyramide en Java pour des exemples de différentes façons de créer des motifs de pyramide.
17. Écrivez un programme Java qui vérifie si deux tableaux contiennent les mêmes éléments.
Pour vérifier si deux tableaux contiennent les mêmes éléments, vous devez d’abord créer un ensemble d’éléments à partir des deux tableaux, puis comparer les éléments de ces ensembles pour trouver s’il existe un élément qui n’est pas présent dans les deux ensembles. Le code d’exemple suivant montre comment vérifier si deux tableaux ne contiennent que des éléments communs:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class ArraySameElements {
public static void main(String[] args) {
Integer[] a1 = {1,2,3,2,1};
Integer[] a2 = {1,2,3};
Integer[] a3 = {1,2,3,4};
System.out.println(sameElements(a1, a2));
System.out.println(sameElements(a1, a3));
}
static boolean sameElements(Object[] array1, Object[] array2) {
Set<Object> uniqueElements1 = new HashSet<>(Arrays.asList(array1));
Set<Object> uniqueElements2 = new HashSet<>(Arrays.asList(array2));
// si la taille est différente, cela signifie qu'il y aura un désaccord
if (uniqueElements1.size() != uniqueElements2.size()) return false;
for (Object obj : uniqueElements1) {
// élément non présent dans les deux?
if (!uniqueElements2.contains(obj)) return false;
}
return true;
}
}
Outputtrue
false
18. Comment obtenir la somme de tous les éléments dans un tableau d’entiers en Java?
Vous pouvez utiliser une boucle for
pour itérer sur les éléments du tableau et les ajouter pour obtenir la somme finale:
int[] array = { 1, 2, 3, 4, 5 };
int sum = 0;
for (int i : array)
sum += i;
System.out.println(sum);
19. Comment trouver le deuxième plus grand nombre dans un tableau en Java?
Il existe de nombreuses façons de résoudre ce problème. Vous pouvez trier le tableau dans l’ordre ascendant naturel et prendre l’avant-dernière valeur. Cependant, le tri est une opération coûteuse. Vous pouvez également utiliser deux variables pour trouver la deuxième plus grande valeur en une seule itération, comme le montre l’exemple suivant:
private static int findSecondHighest(int[] array) {
int highest = Integer.MIN_VALUE;
int secondHighest = Integer.MIN_VALUE;
for (int i : array) {
if (i > highest) {
secondHighest = highest;
highest = i;
} else if (i > secondHighest) {
secondHighest = i;
}
}
return secondHighest;
}
20. Comment mélanger un tableau en Java?
L’exemple de code suivant montre comment utiliser la classe Random
pour générer des indices aléatoires et mélanger les éléments:
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
Random rand = new Random();
for (int i = 0; i < array.length; i++) {
int randomIndexToSwap = rand.nextInt(array.length);
int temp = array[randomIndexToSwap];
array[randomIndexToSwap] = array[i];
array[i] = temp;
}
System.out.println(Arrays.toString(array));
Vous pouvez exécuter le code de mélange à l’intérieur d’une autre boucle for
pour effectuer plusieurs mélanges.
21. Comment trouver une chaîne dans un fichier texte en Java?
L’exemple de code suivant montre comment utiliser la classe Scanner
pour lire le contenu du fichier ligne par ligne, puis utiliser la méthode String contains()
pour vérifier si la chaîne est présente dans le fichier:
boolean findStringInFile(String filePath, String str) throws FileNotFoundException {
File file = new File(filePath);
Scanner scanner = new Scanner(file);
// lire le fichier ligne par ligne
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains(str)) {
scanner.close();
return true;
}
}
scanner.close();
return false;
}
Notez que le code d’exemple suppose que la chaîne que vous recherchez dans le fichier ne contient pas de caractères de saut de ligne.
22. Comment imprimer une date dans un format spécifique en Java?
Le code d’exemple suivant montre comment utiliser la classe SimpleDateFormat
pour formater la chaîne de date :
String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date); // 06-23-2020
Apprenez-en davantage sur la classe Java SimpleDateFormat.
23. Comment fusionner deux listes en Java ?
Le code d’exemple suivant montre comment utiliser la méthode addAll()
pour fusionner plusieurs listes en Java :
List<String> list1 = new ArrayList<>();
list1.add("1");
List<String> list2 = new ArrayList<>();
list2.add("2");
List<String> mergedList = new ArrayList<>(list1);
mergedList.addAll(list2);
System.out.println(mergedList); // [1, 2]
24. Écrivez un programme Java qui trie HashMap par valeur.
HashMap
n’est pas une collection ordonnée. Le code d’exemple suivant montre comment trier les entrées en fonction de la valeur et les stocker dans un LinkedHashMap
, qui maintient l’ordre d’insertion :
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class SortHashMapByValue {
public static void main(String[] args) {
Map<String, Integer> scores = new HashMap<>();
scores.put("David", 95);
scores.put("Jane", 80);
scores.put("Mary", 97);
scores.put("Lisa", 78);
scores.put("Dino", 65);
System.out.println(scores);
scores = sortByValue(scores);
System.out.println(scores);
}
private static Map<String, Integer> sortByValue(Map<String, Integer> scores) {
Map<String, Integer> sortedByValue = new LinkedHashMap<>();
// obtenir l'ensemble des entrées
Set<Entry<String, Integer>> entrySet = scores.entrySet();
System.out.println(entrySet);
// créer une liste car l'ensemble est désordonné
List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
System.out.println(entryList);
// trier la liste par valeur
entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
System.out.println(entryList);
// peupler la nouvelle table de hachage
for (Entry<String, Integer> e : entryList)
sortedByValue.put(e.getKey(), e.getValue());
return sortedByValue;
}
}
25. Comment supprimer toutes les occurrences d’un caractère donné d’une chaîne d’entrée en Java?
La classe String
n’a pas de méthode pour supprimer des caractères. L’exemple de code suivant montre comment utiliser la méthode replace()
pour créer une nouvelle chaîne sans le caractère donné :
String str1 = "abcdABCDabcdABCD";
str1 = str1.replace("a", "");
System.out.println(str1); // bcdABCDbcdABCD
La chaîne est immuable en Java. Toutes les méthodes de manipulation de chaînes renvoient une nouvelle chaîne, c’est pourquoi vous devez l’assigner à une autre variable. En savoir plus sur la suppression de caractères d’une chaîne en Java.
26. Comment obtenir des caractères distincts et leur compte dans une chaîne en Java ?
Vous pouvez créer un tableau de caractères à partir de la chaîne. Ensuite, itérez dessus et créez une HashMap
avec le caractère comme clé et leur compte comme valeur. L’exemple de code suivant montre comment extraire et compter les caractères d’une chaîne :
String str1 = "abcdABCDabcd";
char[] chars = str1.toCharArray();
Map<Character, Integer> charsCount = new HashMap<>();
for (char c : chars) {
if (charsCount.containsKey(c)) {
charsCount.put(c, charsCount.get(c) + 1);
} else
charsCount.put(c, 1);
}
System.out.println(charsCount); // {a=2, A=1, b=2, B=1, c=2, C=1, d=2, D=1}
27. Pouvez-vous prouver qu’un objet String
en Java est immuable de manière programmatique ?
L’exemple de code suivant montre comment prouver qu’un objet String
est immuable, et les commentaires dans le code expliquent chaque étape :
String s1 = "Java"; // La chaîne "Java" est créée dans le pool et la référence est assignée à s1
String s2 = s1; // s2 a également la même référence à "Java" dans le pool
System.out.println(s1 == s2); // preuve que s1 et s2 ont la même référence
s1 = "Python";
// la valeur de s1 a été modifiée ci-dessus, alors comment la chaîne est-elle immuable?
// dans le cas ci-dessus, une nouvelle chaîne "Python" a été créée dans le pool
// s1 fait maintenant référence à la nouvelle chaîne dans le pool
// MAIS, la chaîne d'origine "Java" est toujours inchangée et reste dans le pool
// s2 fait toujours référence à la chaîne d'origine "Java" dans le pool
// preuve que s1 et s2 ont des références différentes
System.out.println(s1 == s2);
System.out.println(s2);
// imprime "Java" soutenant le fait que la valeur de la chaîne d'origine est inchangée, donc la chaîne est immuable
28. Pouvez-vous écrire du code pour montrer l’héritage en Java?
Le code exemple suivant montre comment utiliser le mot-clé extends
pour créer une sous-classe de la classe Animal
. La nouvelle classe Cat
hérite de la variable de la classe Animal
et ajoute plus de code qui appartient uniquement à la classe Cat
.
class Animal {
String color;
}
class Cat extends Animal {
void meow() {
System.out.println("Meow");
}
}
29. Comment montrer un problème de diamant avec une héritage multiple en Java?
Le problème du diamant se produit lorsqu’une classe hérite de plusieurs classes et qu’une ambiguïté survient lorsqu’il n’est pas clair quelle méthode exécuter à partir de quelle classe. Java ne permet pas d’étendre plusieurs classes pour éviter le problème du diamant, comme illustré par l’exemple suivant:
interface I {
void foo();
}
class A implements I {
public void foo() {}
}
class B implements I {
public void foo() {}
}
class C extends A, B { // ne compilera pas
public void bar() {
super.foo();
}
}
30. Comment illustrer un exemple de try catch en Java?
L’exemple de code suivant montre un exemple de try-catch:
try {
FileInputStream fis = new FileInputStream("test.txt");
} catch(FileNotFoundException e) {
e.printStackTrace();
}
À partir de Java 7, vous pouvez également capturer plusieurs exceptions dans un seul bloc catch, comme le montre l’exemple suivant. C’est utile lorsque vous avez le même code dans tous les blocs catch.
public static void foo(int x) throws IllegalArgumentException, NullPointerException {
// du code quelconque
}
public static void main(String[] args) {
try {
foo(10);
} catch (IllegalArgumentException | NullPointerException e) {
System.out.println(e.getMessage());
}
}
31. Écrivez un programme Java pour afficher une NullPointerException
.
Si vous appelez une fonction sur null
, cela déclenchera une NullPointerException
, comme le montre le code exemple suivant:
public static void main(String[] args) {
printString(null, 3);
}
static void printString(String s, int count) {
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase()); // Exception in thread "main" java.lang.NullPointerException
}
}
Vous devriez avoir une vérification de null en place pour une validation précoce, comme le montre le code exemple suivant:
static void printString(String s, int count) {
if (s == null) return;
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase());
}
}
Vous pouvez également déclencher une IllegalArgumentException
en fonction des besoins du projet.
32. Comment créez-vous un enregistrement en Java?
Les enregistrements ont été ajoutés en tant que fonctionnalité standard dans Java 16. Les enregistrements vous permettent de créer une classe POJO avec un code minimal. Les enregistrements génèrent automatiquement du code pour les méthodes hashCode()
, equals()
, les méthodes getter et la méthode toString()
pour la classe. Les enregistrements sont finaux et étendent implicitement la classe java.lang.Record
. Le code exemple suivant montre une façon de créer un enregistrement:
import java.util.Map;
public record EmpRecord(int id, String name, long salary, Map<String, String> addresses) {
}
En savoir plus sur les enregistrements en Java. Pour plus de détails sur POJO, référez-vous à Plain old Java object sur Wikipedia.
33. Comment créez-vous des blocs de texte en Java?
Java 15 a ajouté la fonctionnalité des blocs de texte. Vous pouvez créer des chaînes multilignes en utilisant des blocs de texte. La chaîne multiligne doit être écrite à l’intérieur d’une paire de triple guillemets, comme indiqué dans l’exemple suivant:
String textBlock = """
Hi
Hello
Yes""";
C’est la même chose que de créer une chaîne, comme Salut\\nBonjour\\nOui
.
34. Montrez un exemple d’expressions switch et de cas multi-étiquettes en Java.
Les expressions switch ont été ajoutées en tant que fonctionnalité standard dans Java 14. Les exemples suivants montrent des expressions switch ainsi que des cas multi-étiquettes:
int choice = 2;
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x); // x = 2
Vous pouvez également utiliser des expressions lambda dans les expressions switch.
String day = "TH";
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if (day.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
System.out.println(result); // TTH
35. Comment compiler et exécuter une classe Java depuis la ligne de commande ?
Cet exemple se réfère au fichier Java suivant :
public class Test {
public static void main(String args[]) {
System.out.println("Hi");
}
}
Vous pouvez le compiler en utilisant la commande suivante dans votre terminal :
- javac Test.java
Pour exécuter la classe, utilisez la commande suivante dans votre terminal :
- java Test
Pour les versions récentes, la commande java
compilera également le programme si le fichier de classe n’est pas présent. Si la classe est dans un package, tel que com.example
, alors elle doit se trouver dans le dossier com/example
. La commande pour compiler et exécuter est :
- java com/example/Test.java
Si votre classe nécessite certains JARs supplémentaires pour compiler et s’exécuter, vous pouvez utiliser l’option java -cp
. Par exemple :
- java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java
36. Comment créer une énumération en Java ?
L’exemple de code suivant montre comment créer une énumération de base :
public enum ThreadStates {
START,
RUNNING,
WAITING,
DEAD;
}
ThreadStates
est l’énumération avec les champs constants fixés START
, RUNNING
, WAITING
et DEAD
. Toutes les énumérations étendent implicitement la classe java.lang.Enum
et implémentent les interfaces Serializable
et Comparable
. Les énumérations peuvent également avoir des méthodes. En savoir plus sur les énumérations en Java.
37. Comment utilisez-vous la méthode forEach()
en Java?
La méthode forEach()
fournit un raccourci pour effectuer une action sur tous les éléments d’un itérable. L’exemple de code suivant montre comment itérer sur les éléments de la liste et les imprimer :
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Vous pouvez utiliser la méthode forEach()
avec une expression lambda pour réduire la taille du code, comme le montre l’exemple de code suivant :
List<String> list = new ArrayList<>();
list.forEach(System.out::print);
38. Comment écrivez-vous une interface avec une méthode default
et une méthode static
?
Java 8 a introduit des méthodes par défaut et statiques dans les interfaces. Cela a comblé l’écart entre les interfaces et les classes abstraites. L’exemple de code suivant montre une façon d’écrire une interface avec la méthode default
et static
:
public interface Interface1 {
// méthode abstraite régulière
void method1(String str);
default void log(String str) {
System.out.println("I1 logging::" + str);
}
static boolean isNull(String str) {
System.out.println("Interface Null Check");
return str == null ? true : "".equals(str) ? true : false;
}
}
Apprenez-en davantage sur les méthodes default
et static
dans les interfaces dans les changements d’interface Java 8.
39. Comment créez-vous une interface fonctionnelle?
Une interface avec exactement une méthode abstraite est appelée une interface fonctionnelle. Le principal avantage des interfaces fonctionnelles est que vous pouvez utiliser des expressions lambda pour les instancier et éviter d’utiliser une implémentation de classe anonyme volumineuse. L’annotation @FunctionalInterface
indique une interface fonctionnelle, comme le montre l’exemple de code suivant:
@FunctionalInterface
interface Foo {
void test();
}
40. Montrez un exemple d’utilisation des expressions lambda en Java.
Runnable
est un excellent exemple d’une interface fonctionnelle. Vous pouvez utiliser des expressions lambda pour créer un runnable, comme le montre le code exemple suivant :
Runnable r1 = () -> System.out.println("My Runnable");
41. Montrez des exemples de surcharge et de substitution en Java.
Quand une classe a deux méthodes ou plus avec le même nom, elles sont appelées méthodes surchargées. L’exemple de code suivant montre une méthode surchargée appelée print
:
class Foo {
void print(String s) {
System.out.println(s);
}
void print(String s, int count) {
while (count > 0) {
System.out.println(s);
count--;
}
}
}
Quand une méthode de la superclasse est également implémentée dans la classe enfant, on parle de substitution. L’exemple de code suivant montre comment annoter la méthode printname()
qui est implémentée dans les deux classes :
class Base {
void printName() {
System.out.println("Base Class");
}
}
class Child extends Base {
@Override
void printName() {
System.out.println("Child Class");
}
}
Apprenez-en plus sur la substitution et la surcharge en Java.
42.-49. Devinez la sortie
Testez-vous en devinant la sortie des extraits de code suivants.
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
Output
false
La sortie de l’instruction donnée est false
car l’opérateur +
a une précédence plus élevée que l’opérateur ==
. Ainsi, l’expression donnée est évaluée à “s1 == s2 is:abc” == “abc”
, ce qui est false
.
String s3 = "JournalDev";
int start = 1;
char end = 5;
System.out.println(s3.substring(start, end));
Output
ourn
Le résultat de l’instruction donnée est ourn
. Le premier caractère est automatiquement converti en type int
. Ensuite, puisque l’indice du premier caractère est 0, il commencera par o
et imprimer jusqu’à n
. Notez que la méthode String substring
crée une sous-chaîne qui commence à l’indice start
et s’étend jusqu’au caractère à l’indice end - 1
.
HashSet shortSet = new HashSet();
for (short i = 0; i < 100; i++) {
shortSet.add(i);
shortSet.remove(i - 1);
}
System.out.println(shortSet.size());
Output
100
La taille du shortSet
est 100
. La fonction d’autoboxing en Java signifie que l’expression i
, qui a le type primitif short
, se convertit en un objet Short
. De même, l’expression i - 1
a le type primitif int
et est autoboxée en un objet Integer
. Comme il n’y a pas d’objet Integer
dans le HashSet
, rien n’est supprimé et la taille est 100
.
try {
if (flag) {
while (true) {
}
} else {
System.exit(1);
}
} finally {
System.out.println("In Finally");
}
Output
Aucune sortie. Ce code entraîne une boucle infinie si le drapeau est true
et le programme se termine si le drapeau est false
. Le bloc finally
ne sera jamais atteint.
String str = null;
String str1="abc";
System.out.println(str1.equals("abc") | str.equals(null));
Output
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "<local1>" is null
L’instruction d’impression donnée générera une java.lang.NullPointerException
car l’opérateur logique OR
évalue les littéraux avant de renvoyer le résultat. Comme str
est null
, la méthode .equals()
lancera une exception. Il est toujours conseillé d’utiliser des opérateurs logiques à court-circuit, tels que ||
et &&
, qui évaluent les valeurs littérales de gauche à droite. Dans ce cas, puisque le premier littéral renverrait true
, il ignorerait l’évaluation du deuxième littéral.
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
Output
abc
Le code x.concat(y)
crée une nouvelle chaîne mais n’est pas assigné à x
, donc la valeur de x
n’est pas modifiée.
public class MathTest {
public void main(String[] args) {
int x = 10 * 10 - 10;
System.out.println(x);
}
}
Output
Error: Main method is not static in class MathTest, please define the main method as:
public static void main(String[] args)
Bien qu’il puisse sembler que cette question porte sur l’ordre d’exécution des opérateurs mathématiques, la question porte en réalité sur le fait de remarquer que la méthode principale n’a pas été déclarée static
.
public class Test {
public static void main(String[] args) {
try {
throw new IOException("Hello");
} catch(IOException | Exception e) {
System.out.println(e.getMessage());
}
}
}
Output
Test.java:5: error: cannot find symbol
throw new IOException("Hello");
^
symbol: class IOException
location: class Test
Test.java:6: error: cannot find symbol
}catch(IOException | Exception e) {
^
symbol: class IOException
location: class Test
2 errors
Ce code génère une erreur de compilation. L’exception IOException
est déjà capturée par l’alternative Exception
.
50. Trouvez 5 erreurs dans le fragment de code suivant.
package com.digitalocean.programming-interviews;
public class String Programs {
static void main(String[10] args) {
String s = "abc"
System.out.println(s);
}
}
Answers
- Le nom du package ne peut pas contenir de tirets.
- Le nom de la classe ne peut pas contenir d’espaces.
- La méthode principale n’est pas
public
, donc elle ne s’exécutera pas. - L’argument de la méthode principale ne devrait pas spécifier la taille.
- Le point-virgule est manquant dans la définition de la chaîne.
Conclusion
Cette collection de 50 questions d’entretien sur la programmation Java comprend des questions du niveau débutant au niveau expert, pour vous aider à vous préparer à votre entretien.
Lecture recommandée :
Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions