Java Interview Questions
1) what are static blocks and static initalizers in Java?
Les blocs statiques (ou initialisateurs statiques) sont
utilisés pour initialiser des variables statiques dans une
classe. Ils sont exécutés une seule fois, lorsque la classe
est chargée en mémoire, avant tout autre code.
2) How to call one constructor from the other
constructor?
En Java, on peut appeler un constructeur depuis
un autre à l'aide de this(). Cela permet de
réutiliser un autre constructeur de la même classe.
3) What is method overriding in java?
Le "method overriding" en Java consiste à
redéfinir une méthode d'une classe par une
méthode dans une sous-classe avec la même
signature. Cela permet de modifier le
comportement d'une méthode héritée.
4) What is super keyword in java?
Le mot-clé super en Java est utilisé pour faire
référence à la classe parente d'une classe enfant. Il
permet d'accéder aux membres (méthodes,
variables) de la classe parent.
5) Difference between method overloading and method overriding in java?
En Java, la surcharge (method overloading) se
produit lorsqu'une même méthode porte le même
nom mais avec des paramètres différents. La
redéfinition (method overriding), elle, consiste à
réécrire une méthode d'une classe parente dans
une classe enfant.
6) Difference between abstract class and interface?
Une classe abstraite peut contenir des méthodes avec ou sans implémentation. Elle permet
d'hériter des comportements partagés.
Une interface ne contient que des méthodes sans implémentation (dans les versions précédentes
de Java), et une classe peut implémenter plusieurs interfaces.
7) Why java is platform independent?
Java est indépendant de la plateforme grâce à la machine virtuelle Java (JVM). Le code source
Java est compilé en bytecode, qui est exécuté par la JVM, peu importe le système d'exploitation.
8) What is method overloading in java?
Le surchargement de méthode en Java consiste à définir plusieurs méthodes avec le même nom,
mais des paramètres différents (type, nombre ou ordre).
9) What is difference between c++ and Java?
La principale différence entre C++ et Java est que C++ est un langage compilé, tandis que Java est
un langage interprété (avec une étape de compilation en bytecode).
10) What is JIT compiler ?
Le compilateur JIT (Just-In-Time) compile le code bytecode Java en code machine au moment de
l'exécution, pour améliorer les performances.
11) What is bytecode in java?
Le bytecode en Java est un code intermédiaire généré après la compilation du code source Java. Il
est indépendant de la plateforme et peut être exécuté sur n'importe quelle machine qui possède
la Java Virtual Machine (JVM). Le fichier .java est compilé en .class (bytecode), puis exécuté par
la JVM.
12) Difference between this() and super() in java?
En Java, this() appelle un constructeur de la même classe, tandis que super() appelle un
constructeur de la classe parente.
13) What is a class ?
Une classe est un modèle qui définit des objets. Elle contient des attributs (variables) et des
méthodes (fonctions).
14) What is an object ?
Un objet en Java est une instance d'une classe, qui représente un concept ou une entité du
monde réel.
15) What is method in java ?
Une méthode en Java est un bloc de code qui effectue une tâche spécifique. Elle est définie dans
une classe et peut être appelée pour exécuter cette tâche.
16) What is encapsulation ?
L'encapsulation est un concept de la programmation orientée objet qui consiste à cacher les
détails internes d'une classe et à ne rendre accessibles que les méthodes nécessaires. Cela
protège les données et permet un contrôle total.
17) Why main() method is public, static and void in java ?
La méthode main() en Java est déclarée comme public, static et void pour plusieurs raisons :
public : Pour qu'elle soit accessible par la JVM (Java Virtual Machine).
static : Pour qu'elle soit exécutée sans créer d'objet de la classe.
void : Car elle ne renvoie aucune valeur.
18) Explain about main() method in java ?
La méthode main() est le point d'entrée d'un programme Java. C'est là que l'exécution
commence.
19) What is constructor in java?
Un constructeur en Java est une méthode spéciale utilisée pour initialiser les objets. Il a le même
nom que la classe et n'a pas de type de retour.
20) What is difference between length and length()
method in java ?
En Java, length est un attribut pour les tableaux, et length()
est une méthode pour les chaînes de caractères (String).
21) What is ASCII Code?
Le code ASCII (American Standard Code for Information Interchange) est un système de codage
qui représente des caractères (lettres, chiffres, symboles) sous forme de nombres.
22) What is Unicode ?
Unicode est un système de codage qui permet de représenter tous les caractères de toutes les
langues du monde.
23) Difference between Character Constant and String Constant in java?
En Java, un caractère constant est un seul caractère entouré de guillemets simples, comme 'a',
tandis qu'une chaîne constante est une séquence de caractères entourée de guillemets doubles,
comme "Hello".
24) What are constants and how to create constants in java?
Les constantes en Java sont des valeurs fixes qui ne changent pas pendant l'exécution du
programme. Pour créer une constante, on utilise
le mot-clé final, suivi du type de la variable.
25) Difference between ‘>>’ and ‘>>>’ operators in java?
>> : Déplace les bits vers la droite et garde le signe (les nombres négatifs gardent leur signe).
>>> : Déplace les bits vers la droite et remplace les bits vides par des zéros (les nombres négatifs
ne gardent pas leur signe).
I. Core java Interview questions on Coding Standards
26) Explain Java Coding Standards for classes or Java coding conventions for classes?
Les normes de codage Java pour les classes incluent :
Nom de la classe : Utilise le camel case avec la première lettre en majuscule. Exemple :
MaClasse.
Nom des méthodes : Utilise le camel case avec la première lettre en minuscule. Exemple :
maMethode().
27) Explain Java Coding Standards for:
Interfaces : Nom de l'interface en majuscule, avec des mots clairs. Par exemple, public interface
Drawable { void draw(); }.
Méthodes : Utiliser des verbes au présent. Exemple : public void calculateTotal() {}.
Variables : Nom en camelCase, début en minuscule. Exemple : int totalAmount;.
Constantes : En majuscules, séparées par des underscores. Exemple : public static final int
MAX_SIZE = 100;.
28) ‘IS-A’ and ‘HAS-A’ relationship in java?
En Java, "IS-A" indique l'héritage. class Car extends Vehicle {}
"HAS-A" indique une relation de composition. Un objet a un autre
objet comme attribut.
29) Explain about instanceof operator in java?
L'opérateur instanceof permet de vérifier si un objet
est une instance d'une classe ou d'une interface. Il
retourne true si l'objet est de ce type, sinon false.
30) What does null mean in java?
En Java, null représente l'absence de valeur. Cela signifie qu'une variable de type objet ne pointe
vers aucune instance d'objet.
31) Can we have multiple classes in single file ?
Oui, on peut avoir plusieurs classes dans un seul fichier en Java. Toutefois, une seule classe doit
être publique et porter le même nom que le fichier.
32) What all access modifiers are allowed for top class ?
En Java, pour une classe en haut niveau (c'est-à-dire une
classe qui n'est pas imbriquée dans une autre classe),
les modificateurs d'accès autorisés sont :
public : La classe est accessible depuis n'importe où.
default (sans modificateur) : La classe est accessible
uniquement dans son propre package.
33) Package
Package en Java : Un package est un ensemble de classes et d'interfaces regroupées sous un
même nom.
Plusieurs package statements : Non, un fichier source Java ne peut contenir qu'un seul package
statement au début du fichier.
Package après import : Non, le package statement doit toujours être le premier dans un fichier
source, avant les imports.
34) What are identifiers in java?
Les identifiants en Java sont des noms donnés aux variables, méthodes, classes, etc. Ils doivent
commencer par une lettre, un underscore (_) ou un dollar ($), et peuvent être suivis de lettres,
chiffres, underscores ou dollars.
35) Les modificateurs d'accès en Java permettent de définir la visibilité des classes, méthodes,
variables, etc. Ils sont : public, protected, private, et default (pas de modificateur).
36) Modificateurs pour une classe : public, default (si aucune spécification).
37) Modificateurs pour une méthode : public, protected, private, default.
38) Modificateurs pour une variable : public, protected, private, default.
39) Le modificateur final
Le mot-clé final empêche la modification :
Pour une variable : La valeur ne peut pas être changée après l'initialisation.
Pour une méthode : Elle ne peut pas être redéfinie par une sous-classe.
Pour une classe : Elle ne peut pas être étendue (héritée).
40) Classes abstraites
Une classe abstraite est une classe qui ne peut pas être instanciée directement. Elle contient
souvent des méthodes abstraites qui n'ont pas de corps, donc la sous-classe doit les implémenter.
II. Java Exception Handling Interview questions
41) Une exception en Java est un événement qui interrompt le flux normal d’un programme. Elle
survient lors d’une erreur (ex. : division par zéro, accès à un fichier inexistant).
42) What is Exception handling in java?
La gestion des exceptions permet d'éviter les plantages en capturant et en traitant les
erreurs.
43) What is an eror in Java?
Une erreur en Java peut être un problème dans le code qui empêche le programme de
s'exécuter correctement.
44) Avantages de la gestion des exceptions en Java :
Permet de gérer les erreurs de manière structurée.
Améliore la lisibilité du code.
Permet de maintenir le programme en fonctionnement même après une erreur.
Facilite le débogage.
Sépare la logique de traitement des erreurs de la logique principale.
45) Façons de gérer les exceptions en Java :
Try-Catch : Utilisation d’un bloc try pour tester un code, suivi d'un bloc catch pour attraper
l’exception.
Throws : Permet de déclarer qu’une méthode peut générer une exception.
Throw : Utilisé pour lancer une exception.
46) Cinq mots-clés liés à la gestion des exceptions :
try : Pour définir le bloc où une exception peut se produire.
catch : Pour attraper l’exception générée dans le bloc try.
finally : Code qui s’exécute après le bloc try-catch, qu'il y ait une exception ou non.
throw : Pour lancer une exception manuellement.
throws : Pour déclarer qu’une méthode peut lancer une exception.
47) try et catch :
En Java, try permet d'encadrer le code susceptible de générer une exception, et catch permet
de gérer cette exception.
48) Peut-on avoir un bloc try sans catch ?
Oui, mais il faut alors utiliser un bloc finally, qui est exécuté après le try, qu'il y ait ou non une
exception.
49) Peut-on avoir plusieurs blocs catch pour un bloc try ?
Oui, on peut avoir plusieurs blocs catch pour capturer différentes exceptions.
50) Importance du bloc finally ?
Le bloc finally est exécuté après le bloc try et catch, qu'une exception soit levée ou non. Il est
souvent utilisé pour libérer des ressources comme des fichiers ou des connexions.
51) Peut-on avoir du code entre try et catch ?
Non, tout code entre try et catch doit être dans le bloc try.
52) Peut-on avoir du code entre try et finally ?
Non, finally suit directement try ou catch.
53) Peut-on attraper plusieurs exceptions dans un seul catch ?
Oui, en Java 7+ avec |.
54) Une exception vérifiée (checked exception) est une exception détectée par le compilateur au
moment de la compilation. Le programmeur est obligé de la gérer avec un try-catch ou en la
déclarant avec throws.
55) Exceptions non vérifiées (Unchecked Exceptions)
Ce sont des exceptions héritant de RuntimeException. Elles ne sont pas vérifiées à la
compilation et surviennent généralement à cause d'erreurs de logique.
56) Différences entre exceptions vérifiées et non vérifiées
57) Gestion des exceptions par défaut
Si une exception n'est pas gérée (try-catch), Java l'affiche avec un message d'erreur et
arrête l'exécution du programme.
58) Mot-clé throw
Utilisé pour déclencher une exception manuellement.
59) Peut-on écrire du code après throw ?
Non, après un throw, le programme arrête l'exécution normale. Tout code après throw
devient inaccessible.
60) Importance de throws en Java
Le mot-clé throws signale qu'une méthode peut lever une exception, obligeant l'appelant à la
gérer.
61) Importance de finally par rapport à return
Le bloc finally s'exécute toujours, même après un return, assurant l'exécution du code
critique (ex: fermeture de fichiers).
62) Cas où finally ne s’exécute pas
Si le programme s’arrête brutalement ([Link](0)) ou en cas de crash système.
63) Les exceptions définies par l'utilisateur
Ce sont des exceptions créées par le programmeur en étendant la classe Exception.
64) Peut-on relancer la même exception dans un catch ?
Oui, on peut relancer la même exception avec throw.
65) Peut-on imbriquer des blocs try en Java ?
Oui, on peut imbriquer plusieurs try-catch.
66) Peut-on utiliser catch pour les exceptions vérifiées ?
Oui, mais on doit gérer (OBLIGATOIRE) ces exceptions avec un try-catch ou les déclarer avec
throws.
67) Importance de la classe Throwable et ses méthodes
La classe Throwable est la superclasse de toutes les exceptions et erreurs en Java. Elle permet
de gérer les erreurs grâce aux exceptions. Ses principales méthodes sont :
• getMessage(): retourne le message de l'exception.
• printStackTrace(): affiche la trace de l'exception.
• getCause(): retourne la cause de l'exception.
68) Quand ClassNotFoundException est levée ?
ClassNotFoundException est levée lorsque Java ne trouve pas une classe demandée au
moment de l'exécution (souvent avec [Link]() ou [Link]()).
69) Quand NoClassDefFoundError est levée ?
NoClassDefFoundError est levée lorsqu'une classe était disponible à la compilation mais ne
l'est plus à l'exécution.
III. Oops concepts interview questions
70) Programmation procédurale (ou structurée)
C'est un style de programmation où le code est divisé en fonctions/procédures réutilisables.
❖ Caractéristiques :
• Basé sur des procédures/fonctions.
• Suit un ordre séquentiel.
• Utilise des variables globales et locales.
• Facile à comprendre pour les petits programmes.
71) Programmation orientée objet (POO)
La POO est basée sur des objets qui encapsulent des données et des comportements.
❖ Caractéristiques :
• Encapsulation : Regroupe les données et méthodes associées.
• Héritage : Permet de réutiliser le code d’une classe dans une autre.
• Polymorphisme : Permet d’utiliser un même code pour différents types d’objets.
• Abstraction : Cache les détails d'implémentation.
72) Avantages de la POO
• Réutilisabilité du code grâce à l'héritage.
• Modularité : séparation des fonctionnalités.
• Facilité de maintenance : code mieux organisé.
• Extensibilité : possibilité d’ajouter de nouvelles fonctionnalités sans modifier
l'existant.
73) Différences entre programmation procédurale et POO
74) Encapsulation
L’encapsulation consiste à cacher les détails internes d’un objet et à contrôler son accès via
des getters et setters.
75) Héritage
L’héritage permet à une classe d'hériter des attributs et méthodes d'une autre classe.
76) Polymorphisme
Le polymorphisme permet d'utiliser une même méthode avec des comportements différents.
IV. Core java Serialization interview questions
77) La sérialisation transforme un objet en suite de bytes pour l'enregistrer ou l'envoyer. La
désérialisation le reconstruit.
78) Objectif principal de la sérialisation
La sérialisation sert à convertir un objet Java en un format que l'on peut sauvegarder ou
transmettre, par exemple :
• Dans un fichier pour garder l'objet.
• Sur un réseau pour l'envoyer à un autre ordinateur.
Une fois que l'objet est sérialisé, on peut le récupérer ou le recréer à partir du fichier ou du
réseau avec la désérialisation.
79) Alternatives à la sérialisation Java
• JSON (Jackson, Gson) :
Utilisé pour convertir un objet en texte (plus lisible par l'homme) pour le stocker ou
l'envoyer. Très populaire pour les échanges de données web.
• XML (JAXB) :
Semblable au JSON, mais en utilisant un format XML (plus complexe et structuré).
• Protocol Buffers (Protobuf) :
Un format binaire efficace utilisé pour transmettre des données entre différents
systèmes de manière rapide et compacte (comme Google).
80) Interface Serializable
L'interface Serializable est une interface marqueur (sans méthodes). Un objet d'une classe
implémentant Serializable peut être sérialisé.
81) Comment rendre un objet sérialisable en Java ?
Pour rendre un objet sérialisable, il faut que la classe implémente l'interface Serializable
82) UID de version (serialVersionUID) :
• C'est un identifiant unique pour la classe. Il permet de vérifier si la version de la
classe utilisée pour sérialiser un objet est compatible avec celle utilisée pour
désérialiser.
• Exemple : Si la classe Person a changé mais que tu veux quand même pouvoir lire les
anciennes données, serialVersionUID aide à vérifier cette compatibilité.
83) Que se passe-t-il si on ne définit pas serialVersionUID ?
Si tu ne définis pas cet identifiant, Java le génère automatiquement en fonction de la
structure de ta classe. Si tu modifies la classe (ajout ou suppression de champs), cela peut
empêcher la désérialisation correcte.
84) Les variables statiques peuvent-elles être sérialisées ?
Non, les variables statiques sont partagées entre toutes les instances de la classe, donc elles
ne sont pas sérialisées. La sérialisation est destinée à sauvegarder l'état d'un objet, pas d'une
variable partagée.
85) Lorsque nous sérialisons un objet, est-ce que les références sont sauvegardées aussi ?
Non, lors de la sérialisation, seule l'instance de l'objet est sauvegardée. Imaginons que tu as
un objet A qui contient une référence vers un autre objet B. Si tu sérialises l'objet A, Java va
aussi sérialiser l'objet B auquel il fait référence, mais au lieu de sauvegarder simplement une
"référence" vers B, Java va sauvegarder une copie de l'objet B.
Lorsque tu désérialises l'objet A, Java recrée aussi l'objet B en utilisant la copie sérialisée.
86) Comment empêcher certains champs d'être sérialisés ?
Si tu ne veux pas qu'un champ soit sérialisé (par exemple, un champ qui contient un mot de
passe ou des données sensibles), tu peux utiliser l'annotation transient pour l'exclure de la
sérialisation.
87) Sérialisation dans Spring
❖ Sérialisation d'objets Java en JSON :
Spring utilise souvent Jackson (ou parfois Gson) pour convertir des objets Java en JSON
lors des échanges avec des clients via des API REST.
❖ Annotation @JsonProperty :
Spring permet de contrôler la sérialisation et la désérialisation des propriétés d'un objet
avec l'annotation @JsonProperty de Jackson. Par exemple, tu peux utiliser @JsonIgnore
pour ignorer certaines propriétés lors de la sérialisation.
V. Java Interview questions on threads
88) Qu'est-ce qu'un processus ?
Un processus est un programme en cours d'exécution avec sa propre mémoire. Exemple :
ouvrir deux instances de Chrome crée deux processus distincts.
89) Qu'est-ce qu'un thread en Java ?
Un thread est une unité d'exécution à l'intérieur d'un processus. Exemple : Un lecteur
multimédia peut lire une vidéo (thread 1) et charger des sous-titres (thread 2).
90) Différence entre processus et thread ?
• Processus : mémoire indépendante, plus lourd.
• Thread : partage la mémoire du processus, plus léger.
Exemple : Un navigateur (processus) avec plusieurs onglets (threads).
91) Qu'est-ce que le multitâche ?
Le multitâche permet d'exécuter plusieurs tâches simultanément. Exemple : écouter de la
musique tout en naviguant sur Internet.
92) Quels sont les types de multitâche ?
• Multitâche basé sur les processus : Exécuter plusieurs applications en même temps.
• Multitâche basé sur les threads : Un programme effectue plusieurs tâches
simultanément.
Exemple : Un serveur web qui gère plusieurs requêtes clients avec plusieurs threads.
93) Avantages du multithreading
• Performance : Si une tâche prend du temps (ex. lecture d’un fichier), une autre peut
s'exécuter en parallèle.
• CPU efficace : Utilise mieux le processeur en travaillant sur plusieurs tâches
simultanément.
• Réactivité : Une application reste fluide même si une tâche lourde s’exécute.
• Tâches en arrière-plan : Exemple : un téléchargement continue pendant que
l’utilisateur utilise l’application.
94) Qu'est-ce qu'un thread en Java ?
Un thread est une unité d'exécution indépendante. Java permet d'exécuter plusieurs threads
en parallèle.
95) Pourquoi utiliser plusieurs threads ?
• Exécuter plusieurs tâches en même temps (ex: écouter de la musique tout en
téléchargeant un fichier).
• Améliorer la vitesse d’exécution d’un programme.
• Ne pas bloquer l’interface utilisateur pendant une opération longue.
96) Le thread principal en Java
Le thread principal est celui qui exécute le programme. Java le crée automatiquement.
Résultat : Nom du thread principal : main
97) Meilleure approche pour créer un thread ?
➢ Préférer Runnable :
• Permet l’héritage d’une autre classe.
• Favorise une meilleure conception (séparation de la logique du thread et du thread
lui-même).
• Utile si on veut exécuter le même Runnable sur plusieurs threads.
➢ Utiliser Thread si on ne prévoit pas d’hériter d’une autre classe et qu’on veut juste créer
un thread rapidement.
98) Importance du Thread Scheduler
• Le Thread Scheduler décide quel thread sera exécuté en premier. Java utilise un
ordonnancement non déterministe basé sur :
• La priorité (setPriority(int)) : Plus haute priorité ➔ Plus de chances d’exécution.
• L’état du thread (prêt, en attente, bloqué).
• Le système d’exploitation (Windows/Linux gère ses propres threads).
99) Cycle de vie d’un thread en Java
Un thread passe par 5 états principaux :
• Nouveau (NEW)
Le thread est créé mais pas encore démarré.
Thread t = new Thread();
• Prêt (RUNNABLE)
start() est appelé, le thread attend l’exécution.
• En cours d’exécution (RUNNING)
run() s’exécute activement.
• Bloqué (WAITING, TIMED_WAITING, BLOCKED)
Le thread attend une ressource ou un événement.
Exemple : sleep(1000), join(), synchronized.
• Terminé (TERMINATED)
Le thread a fini son exécution ou s’est arrêté.
100) Peut-on redémarrer un thread mort en Java ?
Non, un thread terminé ne peut pas être redémarré. Il faut créer un nouveau thread.
101) Peut-on redémarrer un thread déjà démarré ?
Non, un thread démarré ne peut pas être redémarré.
102) Peut-on surcharger run() en Java ?
Oui, mais seul run() sans argument sera exécuté par start().
103) Que se passe-t-il si on ne surcharge pas run() ?
Le thread s'exécute mais ne fait rien d’utile.
104) Un thread peut-il bloquer un autre thread ?
Oui, via synchronized, un thread peut empêcher l'accès à une ressource partagée.
105) Qu'est-ce qu'une méthode synchronisée ?
Une méthode synchronisée est une méthode déclarée avec synchronized, assurant qu’un seul
thread à la fois peut l’exécuter.
106) Quand utilise-t-on les méthodes synchronisées en Java ?
On les utilise lorsque plusieurs threads accèdent concurremment à une même ressource et
qu’il faut éviter les incohérences des données.
107) Qu'est-ce qu'un lock en Java ?
Un lock est un mécanisme permettant de contrôler l'accès concurrent à une ressource
partagée. Il empêche plusieurs threads d'exécuter du code critique simultanément, évitant
ainsi les problèmes de concurrence.
108) Un thread peut-il exécuter d'autres méthodes synchronisées simultanément ?
Oui et Non, cela dépend du verrou :
• Même objet : Si une méthode synchronized est en cours d'exécution sur un objet, un autre
thread ne peut pas exécuter une autre méthode synchronized de ce même objet.
• Objets différents : Si deux threads accèdent à deux instances différentes, ils peuvent
exécuter simultanément des méthodes synchronized.
109) Lorsqu'un thread exécute une méthode synchronisée, peut-il accéder à d'autres
méthodes synchronisées de l'objet ?
Oui, un thread peut accéder à d'autres méthodes synchronisées du même objet tant qu'il
n'est pas dans une méthode synchronisée d'une autre instance de l'objet ou d'un autre objet.
Cependant, il doit respecter le verrou de l'objet pour une méthode synchronisée.
110) Que sont les blocs synchronisés en Java ?
Les blocs synchronisés permettent de synchroniser
seulement une partie du code au lieu de
synchroniser toute la méthode. Cela offre plus de
flexibilité et de performance, car il ne verrouille que
la section nécessaire du code.
111) Quand utiliser des blocs synchronisés et quels sont leurs avantages ?
On utilise les blocs synchronisés lorsque l'on souhaite limiter la portée du verrou à une
section spécifique du code, améliorant ainsi les performances en évitant de bloquer toute la
méthode. L'avantage principal est une gestion plus fine des ressources et un meilleur
contrôle de la concurrence.
112) Qu'est-ce qu'un verrou au niveau de la classe ?
Un verrou au niveau de la classe (ou verrou de la classe) est un verrou utilisé pour
synchroniser les méthodes statiques d'une classe. Il est basé sur l'objet Class de la classe, et il
empêche l'accès concurrent aux méthodes statiques.
113) La différence principale entre une méthode statique et une méthode simple
(d'instance) en termes de synchronisation est le verrou utilisé :
➢ Méthode synchronisée simple (d'instance)
• Utilise le verrou de l'instance (this).
• Chaque objet a son propre verrou, donc plusieurs threads peuvent appeler la
méthode sur des instances différentes sans problème.
➢ Méthode synchronisée statique
• Utilise le verrou de la classe (Class de l'objet).
• Un seul thread peut accéder aux méthodes statiques synchronisées, même si
plusieurs instances existent.
➢ Différence clé :
• Méthode d'instance : chaque objet a son propre verrou.
• Méthode statique : un seul verrou pour toute la classe (partagé entre toutes les
instances).
114) Peut-on utiliser un bloc synchronized pour les
types primitifs ?
Non, on ne peut pas synchroniser directement un type
primitif (int, double, etc.) car synchronized s'applique
aux objets. Pour synchroniser une variable primitive,
on l'encapsule dans un objet comme Integer.
115) Qu'est-ce que la priorité des threads et pourquoi est-ce important ?
Chaque thread a une priorité (de 1 à 10). Une priorité plus élevée signifie qu'il a plus de
chances d’être exécuté avant un thread de priorité inférieure. Cependant, l’ordonnancement
des threads dépend du système d’exploitation et de la JVM.
116) Types de priorités de threads
• Thread.MIN_PRIORITY (1) : Basse priorité
• Thread.NORM_PRIORITY (5) : Priorité normale (par défaut)
• Thread.MAX_PRIORITY (10) : Haute priorité
117) Comment changer la priorité d'un thread ?
On utilise setPriority(int priority).
118) Si deux threads ont la même priorité, lequel s'exécute en premier ?
Lorsqu'on a deux threads avec la même priorité, leur ordre d'exécution n'est pas garanti. Cela
dépend de la stratégie d’ordonnancement utilisée par le système d’exploitation et la JVM.
➢ L'ordonnancement des threads
L'ordonnancement des threads est le mécanisme qui décide quel thread doit s’exécuter
à un instant donné. Il existe deux types d’ordonnancement :
• Préemptif (Time-Slicing)
Dans ce modèle, le système attribue un temps d’exécution à chaque thread. Lorsque
ce temps est écoulé, un autre thread prend le relais.
✓ Chaque thread tourne pendant une période déterminée.
✓ Après cette période, le système change de thread (sauf si un thread de plus haute
priorité arrive).
✓ Exemple : Plusieurs onglets d’un navigateur fonctionnent en parallèle.
• Coopératif (Volontaire)
Dans ce modèle, un thread s'exécute jusqu'à ce qu'il libère volontairement le CPU
(via yield(), sleep(), ou wait()).
✓ Un thread tourne jusqu'à ce qu’il décide de s’arrêter.
✓ Il peut libérer le CPU en appelant [Link]() pour laisser une chance aux
autres threads.
Exemple : Un jeu vidéo où un thread attend qu’un joueur entre une action avant
de continuer.
119) Méthode yield()
Elle demande au thread en cours de s'interrompre pour laisser d'autres threads s'exécuter.
Ici, [Link]() laisse une chance aux autres threads.
120) Un thread yieldé peut-il être réexécuté ?
Oui, un thread qui a cédé (yield()) peut être reprogrammé immédiatement s'il est sélectionné
à nouveau par le planificateur.
121) Méthode join()
Elle force un thread à attendre qu'un autre thread se termine.
122) Méthode sleep()
• Elle suspend l'exécution d'un thread pendant un certain temps.
• Oui, quand un thread appelle sleep(), il est mis en pause, et le planificateur peut
exécuter un autre thread disponible.
123) sleep() libère-t-il un verrou ?
Non, si un thread détient un verrou (synchronized), sleep() ne libère pas ce verrou.
124) Méthode interrupt() de la classe Thread
La méthode interrupt() est utilisée pour interrompre un thread en cours d'exécution. Elle ne
stoppe pas immédiatement le thread mais lui envoie un signal d'interruption.
125) Communication entre threads (Interthread communication)
En Java, les threads peuvent communiquer entre eux grâce aux méthodes wait(), notify() et
notifyAll(). Cela permet de synchroniser l'exécution de plusieurs threads.
• wait(): Met un thread en attente jusqu'à ce qu'il reçoive une notification.
• notify(): Réveille un seul thread en attente.
• notifyAll(): Réveille tous les threads en attente.
126) Pourquoi ces méthodes sont dans Object et non dans Thread ?
Ces méthodes concernent la gestion de l'état des objets partagés entre plusieurs threads, et
non les threads eux-mêmes. En Java, chaque objet possède un moniteur (verrou) qui est
utilisé pour la synchronisation, donc ces méthodes appartiennent à Object.
➔
127) IllegalMonitorStateException
Cette erreur se produit si wait(), notify(), ou notifyAll() sont appelés sans synchronized.
128) Est-ce que wait(), notify(), notifyAll() libèrent le verrou ?
• wait() : Oui, il libère le verrou et met le thread en attente.
• notify() et notifyAll() : Non, ils réveillent un thread mais ne libèrent pas
immédiatement le verrou. Le verrou est libéré uniquement quand le bloc
synchronized se termine.
129) Qui libère le verrou parmi yield(), join(), sleep(), wait(), notify(), notifyAll() ?
• wait() : libère le verrou pendant l'attente.
• notify() et notifyAll() : ne libèrent pas directement le verrou, mais réveillent
les threads en attente sur l'objet.
• yield(), join() et sleep() : ne libèrent pas le verrou de manière explicite, mais
peuvent laisser l'option à d'autres threads de s'exécuter.
130) Qu'est-ce qu'un groupe de threads (Thread Group) ?
Un Thread Group est une manière d'organiser et de gérer plusieurs threads ensemble. Cela
permet de manipuler un ensemble de threads en même temps (par exemple, les arrêter tous
d'un coup).
131) Qu'est-ce que des variables locales de thread (ThreadLocal) ?
ThreadLocal permet à chaque thread d'avoir sa propre copie d'une variable. Ainsi, chaque
thread peut modifier sa valeur sans affecter les autres threads.
132) Qu'est-ce qu'un thread daemon ?
Un thread daemon est un thread en arrière-plan, utilisé pour des tâches de support comme
la gestion de la mémoire. Un thread daemon s'arrête automatiquement lorsque tous les
threads non-daemon terminent.
133) Comment rendre un thread non-daemon en daemon ?
Un thread est non-daemon par défaut. Pour le rendre daemon, il faut appeler
setDaemon(true) avant de démarrer le thread.
134) Peut-on rendre le thread main() en daemon ?
Non, on ne peut pas rendre le thread principal daemon. Seuls les threads créés par
l'utilisateur peuvent être convertis en daemon avant leur démarrage.
VI. Collection Framework interview questions
135) Qu'est-ce que le framework de collections ?
Le framework de collections est un ensemble d'interfaces et de classes en Java qui
permettent de stocker, manipuler et gérer des groupes d'objets de manière efficace.
136) Qu'est-ce qu'une collection ?
Une collection est une structure de données qui peut contenir plusieurs objets.
137) collection : C'est un mot générique,
souvent utilisé pour désigner une variable qui
contient une collection.
138) Collection : C'est une interface
dans le framework des collections. Elle
définit des méthodes pour ajouter,
supprimer, et accéder aux éléments d'une
collection. Elle définit des méthodes comme add(), remove(), size(), etc. Les classes qui
l'implémentent peuvent ajouter ou supprimer des éléments, obtenir la taille, vérifier si un
élément est présent, etc.
139) Collections : C'est une classe
utilitaire avec des méthodes statiques
pour manipuler les collections, comme
trier ou rechercher des éléments.
140) Lister les interfaces qui étendent l'interface Collection ?
❖ List : une collection ordonnée qui peut contenir des éléments dupliqués. Exemple :
ArrayList.
❖ Set : une collection qui ne permet pas les éléments dupliqués. Exemple : HashSet.
❖ Queue : une collection qui suit un ordre FIFO (First In First Out). Exemple : LinkedList.
❖ Une Deque (Double-Ended Queue) est une structure de données qui permet d'ajouter ou
de retirer des éléments aux deux extrémités (au début et à la fin).
141) Interface List en Java
L'interface List en Java est une collection ordonnée qui permet les éléments en double et
conserve l'ordre d'insertion.
142) Méthodes spécifiques à List
• add(E e): Ajoute un élément.
• get(int index): Récupère un élément.
• remove(int index): Supprime un élément.
• set(int index, E element): Modifie un élément.
• size(): Retourne la taille.
143) Implémentations de List
• ArrayList
ArrayList est basé sur un tableau dynamique, rapide en lecture mais lent en
modification.
✓ Différence entre Array et ArrayList
• Vector
Vector est comme ArrayList mais synchronisé (thread-safe).
✓ Différence entre ArrayList et Vector
• LinkedList et ses caractéristiques
Une LinkedList est une structure de données en liste chaînée qui permet d'insérer et de
supprimer des éléments efficacement. Contrairement à un ArrayList, qui utilise un
tableau dynamique, une LinkedList stocke chaque élément sous forme de nœud
contenant :
✓ Une valeur (l'élément stocké).
✓ Une référence vers l'élément suivant (et vers l'élément précédent pour une double
liste chaînée).
• Iterator et ses méthodes
Un Iterator est un objet qui permet de parcourir une collection (List, Set, Queue, etc.)
sans utiliser de boucle classique (for ou while). Il offre plus de flexibilité, surtout pour
supprimer des éléments en toute sécurité.
✓ Méthodes principales de Iterator :
❖ hasNext() : Vérifie s'il reste un élément à parcourir.
❖ next() : Retourne l'élément suivant et avance l'itérateur.
❖ remove() : Supprime l'élément actuel.
144) Ordre d'itération d'un Iterator
Un Iterator parcourt les éléments d'une collection dans l'ordre d'ajout, sauf si l'ordre est
spécifié autrement (par exemple avec un TreeSet).
145) ListIterator et ses méthodes
ListIterator est un type spécial d'Iterator pour les listes. Il permet de parcourir la liste dans les
deux sens (avant et arrière).
146) Qu'est-ce qu'un Set ?
Un Set est une collection d'éléments uniques (pas de doublons).
147) Implémentations de Set
Les Set peuvent être implémentés de différentes manières :
• HashSet : ne garantit pas l'ordre des éléments
• LinkedHashSet : garde l'ordre d'ajout
• TreeSet : trie les éléments.
148) HashSet et ses caractéristiques
HashSet est très rapide pour ajouter, supprimer et vérifier des éléments, mais il ne garde pas
l'ordre d'insertion.
149) TreeSet et ses caractéristiques
TreeSet trie les éléments automatiquement.
150) Quand utiliser HashSet plutôt que TreeSet ?
• Utilise HashSet si l'ordre des éléments ne compte pas.
• Utilise TreeSet si tu veux que les éléments soient triés.
151) LinkedHashSet et ses caractéristiques
LinkedHashSet conserve l'ordre d'insertion des éléments.
152) Interface Map en Java
Map est une collection de paires clé-valeur.
153) LinkedHashMap : C'est une implémentation de la map qui conserve l'ordre
d'insertion des éléments. Il est basé sur une table de hachage mais avec une liste doublement
chaînée pour maintenir l'ordre.
Caractéristiques :
• Maintien l'ordre d'insertion.
• Accès rapide aux éléments.
• Plus lent qu'un HashMap pour certaines opérations.
154) SortedMap : Interface qui étend Map et garantit que les clés sont triées.
155) Hashtable : C'est une implémentation de Map qui est synchronisée, donc thread-safe.
Caractéristiques :
• Synchronisation intégrée.
• Pas de clés ou valeurs null.
• Plus lent que HashMap dans des applications non concurrentes.
156) Différence entre HashMap et Hashtable :
• Synchronisation : Hashtable est synchronisé, tandis que HashMap ne l'est pas.
• Null : HashMap accepte les clés et valeurs null, alors que Hashtable n'accepte ni l'un
ni l'autre.
• Performance : HashMap est plus rapide.
157) Différence entre ArrayList et LinkedList :
• ArrayList utilise un tableau dynamique pour stocker les éléments, offrant un accès
rapide par index.
• LinkedList utilise des nœuds chaînés, ce qui permet des insertions et suppressions
plus rapides, mais l'accès est plus lent.
158) Comparable
• Comparable est utilisé pour définir l'ordre naturel des objets dans leur propre classe.
Exemple : Imaginons une classe Person avec un nom. Si tu veux trier des objets
Person par leur nom, tu utilises Comparable dans la classe Person.
159) Comparator
• Comparator permet de définir un ordre de tri extérieur à la classe, dans une autre
classe ou un endroit séparé.
Exemple : Si tu veux trier des objets Person de manière différente (par exemple, par
l'âge au lieu du nom), tu peux utiliser un Comparator :