JAVA AVANCÉ
Fiche Complète de Révision
GL2 · INSAT · Tous les concepts de l'examen
Sommaire
1. Thread & Runnable 2. Synchronisation
3. Blocs Init (statique/instance) 4. [Link]
5. Héritage & blocs d'init 6. Garbage Collection
7. Sérialisation 8. Collections Java
9. JTable & TableModel 10. Boxing / Widening / Var-args
11. Assertions 12. Exceptions
13. Sockets (Client/Serveur) 14. Parsing & Tokenizing
■ 1. Thread & Runnable
Définitions
• Thread : unité d'exécution légère au sein d'un processus. Plusieurs threads partagent la mémoire du même processus.
• Runnable : interface fonctionnelle [Link] avec une seule méthode run(). Représente une tâche
exécutable.
• Processus vs Thread : un processus possède son propre espace mémoire ; les threads d'un même processus partagent le
tas (heap).
Deux façons de créer un Thread
Méthode 1 : étendre Thread Méthode 2 : implémenter Runnable
class MonThread extends Thread { class MaTache implements Runnable {
public void run() { public void run() {
// tâche // tâche
} }
} }
new MonThread().start(); new Thread(new MaTache()).start();
Avantage : simple Avantage : plus flexible, séparation tâche/thread
Inconvénient : impossible d'hériter d'une autre classe Recommandé en pratique
Cycle de vie d'un Thread
État Description
NEW Créé, start() pas encore appelé
RUNNABLE En cours d'exécution ou prêt
BLOCKED En attente d'un moniteur (verrou)
WAITING En attente indéfinie (wait(), join())
TIMED_WAITING En attente temporisée (sleep(n))
Java Avancé — Fiche de Révision GL2 INSAT Page 1
TERMINATED Exécution terminée
Opérations de contrôle importantes
Méthode Rôle
start() Démarre le thread (appelle run() dans nouveau thread)
run() Corps de la tâche (NE PAS appeler directement)
sleep(ms) Suspend le thread courant N millisecondes (InterruptedException)
join() Attend la fin d'un autre thread
interrupt() Interrompt un thread en attente
yield() Suggère au scheduler de passer la main
setPriority(n) Définit la priorité (1-10, défaut=5)
isAlive() Retourne true si le thread est actif
setDaemon(true) Thread démon : termine quand tous les non-démons se terminent
■ 2. Synchronisation en Java
Pourquoi ? Quand plusieurs threads accèdent à une ressource partagée en écriture, il peut se produire des race conditions
(résultats imprévisibles). La synchronisation garantit la cohérence des données.
Mécanismes de synchronisation
Mécanisme Syntaxe / Description
synchronized void methode() { ... }
Méthode synchronized Verrou sur l'objet this
synchronized(objet) { ... }
Bloc synchronized Verrou plus fin, sur un objet précis
wait() Relâche le verrou et attend qu'un autre thread appelle notify()
notify() Réveille un thread en attente sur le même moniteur
notifyAll() Réveille tous les threads en attente sur le moniteur
volatile Garantit la visibilité entre threads (pas d'atomicité)
ReentrantLock [Link] — verrouillage explicite, plus flexible
Exemple classique — Producteur/Consommateur
class Buffer {
private int valeur; private boolean plein = false;
synchronized void produire(int v) throws InterruptedException {
while (plein) wait(); // attendre si plein
valeur = v; plein = true;
notify(); // réveiller le consommateur
}
synchronized int consommer() throws InterruptedException {
while (!plein) wait();
plein = false; notify(); return valeur;
}
}
■■ Deadlock : situation où deux threads s'attendent mutuellement. Eviter en acquérant toujours les verrous dans le même
ordre.
■■ 3. Blocs d'Initialisation — Statique & Instance
Bloc Statique Bloc d'Instance
Java Avancé — Fiche de Révision GL2 INSAT Page 2
Bloc d'instance
Bloc statique Déclaré avec { ... } (sans static)
Déclaré avec static { ... } • Exécuté à chaque instanciation, avant le constructeur
• Exécuté une seule fois au chargement de la classe • Copié dans chaque constructeur par le compilateur
• Avant tout constructeur et tout bloc d'instance • Utile pour factoriser du code commun à plusieurs
• Utilisé pour initialiser des champs statiques complexes constructeurs
Ordre d'exécution (règle fondamentale)
Ordre Quoi Fréquence
1 Bloc statique de la classe PARENTE Une fois (1ère utilisation)
2 Bloc statique de la classe ENFANT Une fois (1ère utilisation)
3 Bloc d'instance de la classe PARENTE À chaque new
4 Constructeur de la classe PARENTE (super()) À chaque new
5 Bloc d'instance de la classe ENFANT À chaque new
6 Constructeur de la classe ENFANT À chaque new
Résultat du code Tableau 1 (Exercice 2)
Exécution de new Init() — analyse étape par étape :
① Chargement de InitParent → bloc statique InitParent : InitParent : init statique
② Chargement de Init → bloc statique Init : Init : init statique
③ new Init() appelle Init() → super() implicite → bloc instance InitParent : InitParent : init d'instance
④ Constructeur InitParent() : InitParent : constructeur sans arg
⑤ Bloc instance Init : Init : init d'instance
⑥ Constructeur Init() : Init : constructeur sans arg
Sortie console :
InitParent : init statique
Init : init statique
InitParent : init d'instance
InitParent : constructeur sans arg
Init : init d'instance
Init : constructeur sans arg
■ 4. [Link]
La classe [Link] représente un chemin de fichier ou de répertoire dans le système de fichiers. Elle ne lit ni n'écrit de
données — elle sert à manipuler les métadonnées.
Méthode Description
new File(path) Crée une référence à un chemin
exists() Vérifie l'existence
isFile() / isDirectory() Type de l'entrée
createNewFile() Crée un fichier vide (IOException)
mkdir() / mkdirs() Crée répertoire(s)
delete() Supprime fichier ou répertoire vide
list() / listFiles() Liste le contenu d'un répertoire
getName() / getPath() Retourne nom / chemin
Java Avancé — Fiche de Révision GL2 INSAT Page 3
length() Taille en octets
renameTo(File dest) Renomme/déplace
lastModified() Timestamp de dernière modif (long)
Lire / Écrire dans un fichier texte
// Écriture
BufferedWriter bw = new BufferedWriter(new FileWriter("[Link]"));
[Link]("Bonjour"); [Link](); [Link]();
// Lecture
BufferedReader br = new BufferedReader(new FileReader("[Link]"));
String ligne; while ((ligne = [Link]()) != null) [Link](ligne);
[Link]();
■■ 5. Garbage Collection (GC)
La Garbage Collection (collecte des ordures) est le mécanisme automatique de la JVM qui libère la mémoire occupée par des
objets qui ne sont plus référencés. Le développeur n'a PAS à libérer la mémoire manuellement (contrairement à C/C++).
Fonctionnement
• Mark & Sweep : la JVM marque tous les objets accessibles depuis les "GC roots" (variables locales, champs statiques), puis
libère les non-marqués.
• Générations : le tas est divisé en Young Generation (Eden + Survivors) et Old Generation. Les objets jeunes sont collectés
plus souvent (Minor GC).
• GC roots : threads actifs, variables locales, références statiques, JNI references.
• Un objet devient éligible au GC quand plus aucune référence forte ne pointe vers lui.
[Link]() Références faibles
Suggestion au GC de s'exécuter. La JVM peut ignorer l'appel. WeakReference<T> : collectée si seule référence.
Non recommandé en production. SoftReference<T> : collectée si manque mémoire.
finalize() Bonnes pratiques
Méthode appelée par le GC avant de libérer l'objet. Dépréciée Mettre les références à null quand inutiles.
(Java 9+). Imprévisible. Utiliser try-with-resources pour les ressources.
Java Avancé — Fiche de Révision GL2 INSAT Page 4
■ 6. Sérialisation en Java
La sérialisation est le processus de conversion d'un objet Java en flux d'octets (pour le sauvegarder dans un fichier ou l'envoyer
sur le réseau). La désérialisation est l'opération inverse.
Sérialisation Désérialisation
Sérialisation (objet → octets) Désérialisation (octets → objet)
ObjectOutputStream oos = ObjectInputStream ois =
new ObjectOutputStream( new ObjectInputStream(
new FileOutputStream("[Link]")); new FileInputStream("[Link]"));
[Link](monObjet); MonClasse obj = (MonClasse) [Link]();
[Link](); [Link]();
Conditions et mots-clés importants
• La classe doit implémenter [Link] (interface marqueur, sans méthodes).
• serialVersionUID : identifiant de version pour vérifier la compatibilité à la désérialisation.
• Champ transient : exclu de la sérialisation (ex: mot de passe, connexion BD).
• Les champs static ne sont PAS sérialisés (appartiennent à la classe, non à l'objet).
• La classe mère doit aussi être Serializable, ou avoir un constructeur sans argument.
class Employe implements Serializable {
private static final long serialVersionUID = 1L;
String nom;
transient String motDePasse; // non sérialisé
}
■ 7. Collections Java
Le Java Collections Framework fournit des structures de données génériques réutilisables. Il repose sur des interfaces et des
classes d'implémentation.
Interface Implémentations clés Caractéristiques
List ArrayList, LinkedList, Vector Ordonnée, doublons autorisés, accès par index
Set HashSet, LinkedHashSet, TreeSet Pas de doublons. TreeSet = trié
Map HashMap, LinkedHashMap, TreeMap, Hashtable Paires clé→valeur, clés uniques
Queue LinkedList, PriorityQueue, ArrayDeque FIFO. PriorityQueue = ordre naturel
Deque ArrayDeque, LinkedList Double-ended queue (pile + file)
Stack Stack (déprécié), Deque préféré LIFO
Méthodes essentielles — Iterator & for-each
List liste = new ArrayList<>();
[Link]("A"); [Link]("B"); [Link]("A");
[Link](0); [Link](); [Link]("B");
// Parcours avec Iterator (suppression sécurisée)
Iterator it = [Link]();
while ([Link]()) { String s = [Link](); if ([Link]("B")) [Link](); }
// Map
Map map = new HashMap<>();
[Link]("Alice", 25); [Link]("Alice"); [Link]("Alice");
for ([Link] e : [Link]()) { ... }
HashMap vs TreeMap vs LinkedHashMap
Java Avancé — Fiche de Révision GL2 INSAT Page 5
HashMap LinkedHashMap
• O(1) get/put • O(1) get/put
• Ordre non garanti • Ordre d'insertion préservé
• 1 null key autorisée • Utile pour LRU cache
TreeMap Hashtable
• O(log n) get/put • Synchronisé (thread-safe)
• Trié par clé (ordre naturel ou Comparator) • Déprécié → utiliser ConcurrentHashMap
• Implements NavigableMap • Null key/value interdits
■ 8. JTable & TableModel
JTable est un composant Swing qui affiche des données tabulaires. Il suit le pattern MVC : le TableModel (modèle) contient les
données, JTable (vue) les affiche, et le contrôleur gère les interactions.
DefaultTableModel AbstractTableModel (custom)
DefaultTableModel
Implémentation prête à l'emploi. AbstractTableModel (custom)
DefaultTableModel model = Implémenter 3 méthodes :
new DefaultTableModel( getRowCount() → nb lignes
new Object[]{"Nom","Age"},0); getColumnCount() → nb colonnes
[Link](new Object[]{"Ali",22}); getValueAt(row,col) → valeur
JTable table = new JTable(model); Appeler fireTableDataChanged() pour notifier la vue.
Mécanisme de liaison données ↔ JTable
• JTable délègue toutes les opérations au TableModel via l'interface.
• Quand les données changent, le modèle notifie la vue via fireTable*() (pattern Observer).
• Pour rendre une cellule éditable : surcharger isCellEditable(row, col).
• Pour typer les colonnes : surcharger getColumnClass(col) → active le bon renderer (case à cocher pour Boolean, etc.).
• Tri automatique : [Link](true).
• Pour mettre la table dans un scroll : new JScrollPane(table).
■ 9. Boxing, Widening & Var-args — Ordre de choix JVM
Widening Boxing
Widening (élargissement) Boxing / Unboxing
Conversion implicite vers un type plus large. Conversion automatique type primitif ↔ wrapper.
byte→short→int→long→float→double int → Integer (boxing)
Ex: int i = 5; long l = i; Integer → int (unboxing)
Var-args (arguments variables)
void methode(int... vals) — accepte 0 ou N arguments. Syntaxiquement un tableau. Doit être le dernier paramètre.
Ordre de priorité de la JVM lors de la résolution de méthode :
① Widening — toujours essayé en premier (pas d'overhead à l'exécution)
② Boxing — essayé ensuite (coût faible mais wrapper inutile si widening possible)
③ Var-args — en dernier recours (le moins spécifique)
Pourquoi ? La JVM favorise les conversions les moins coûteuses en priorité. Le widening est une conversion numérique sans
allocation ; le boxing alloue un objet wrapper ; les var-args créent un tableau implicite.
■■ 10. Exceptions en Java
Java Avancé — Fiche de Révision GL2 INSAT Page 6
Hiérarchie
Throwable
■■■ Error (JVM errors — ne pas attraper)
■ ■■■ OutOfMemoryError
■ ■■■ StackOverflowError
■■■ Exception
■■■ IOException (checked)
■■■ SQLException (checked)
■■■ RuntimeException (unchecked — pas obligé de déclarer)
■■■ NullPointerException
■■■ ArrayIndexOutOfBoundsException
■■■ ClassCastException
Checked Unchecked
Checked Exception Unchecked Exception
• Doit être déclarée (throws) ou attrapée • Sous-classe de RuntimeException
• Représente des erreurs prévisibles (fichier absent, réseau) • Erreurs de programmation (null, index hors bornes)
• Ex : IOException, SQLException • Ex : NPE, ArrayIndexOutOfBounds
try {
// code risqué
} catch (IOException e) {
[Link]();
} catch (Exception e) { // attrape le reste
[Link]([Link]());
} finally {
// toujours exécuté (fermeture ressources)
}
// Try-with-resources (Java 7+) — fermeture automatique
try (BufferedReader br = new BufferedReader(new FileReader("[Link]"))) {
// [Link]() appelé automatiquement
}
■ 11. Assertions
Une assertion est une condition supposée toujours vraie à un point du code. Si elle est fausse, une AssertionError est levée.
Outil de débogage et de documentation du code.
assert condition; // forme simple
assert condition : "message d'erreur"; // avec message
int age = -5;
assert age >= 0 : "Age négatif : " + age; // AssertionError si false
• Désactivées par défaut à l'exécution. Pour les activer : java -ea NomClasse
• NE PAS utiliser pour valider des entrées utilisateur (utiliser des exceptions à la place).
• Utilisées pour vérifier des invariants internes, post-conditions, et hypothèses du développeur.
• AssertionError étend Error → ne pas l'attraper.
Java Avancé — Fiche de Révision GL2 INSAT Page 7
■ 12. Sockets — Application Client/Serveur
Java fournit [Link] (client) et [Link] (serveur) pour la communication réseau via TCP.
SERVEUR CLIENT
Côté SERVEUR
// 1. Écouter sur un port Côté CLIENT
ServerSocket srv = // 1. Se connecter au serveur
new ServerSocket(8080); Socket sock =
new Socket("localhost", 8080);
// 2. Attendre connexion
Socket client = [Link](); // 2. Lire/Écrire
PrintWriter out = new PrintWriter(
// 3. Lire/Écrire [Link](), true);
BufferedReader in = new BufferedReader( BufferedReader in = new BufferedReader(
new InputStreamReader( new InputStreamReader(
[Link]())); [Link]()));
PrintWriter out = new PrintWriter(
[Link](), true); [Link]("Bonjour Serveur");
String msg = [Link](); String rep = [Link]();
[Link]("Reçu : " + msg); [Link](rep);
[Link](); [Link](); [Link]();
• Serveur multi-clients : lancer un new Thread(new ClientHandler(client)).start() pour chaque connexion
acceptée.
• UDP : utiliser DatagramSocket et DatagramPacket pour des envois sans connexion (plus rapide, pas fiable).
• URL / URLConnection : pour envoyer une requête HTTP vers une machine distante.
■ 13. Parsing & Tokenizing (String)
split() StringTokenizer
StringTokenizer
[Link](regex) StringTokenizer st =
String s = "a,b,c"; new StringTokenizer("a b c");
String[] t = [Link](","); while ([Link]())
// t = ["a","b","c"] [Link]([Link]());
Accepte une regex. Limite optionnelle. Plus rapide que split, pas de regex.
Scanner parseInt / parseDouble
Scanner (parsing de types) Parsing de types primitifs
Scanner sc = new Scanner("42 3.14"); [Link]("42") → 42
int n = [Link](); [Link]("3.14") → 3.14
double d = [Link](); [Link]("true") → true
Peut aussi lire depuis [Link] ou un File. [Link](42) → "42"
String — méthodes clés à connaître
Méthode Description
length() Longueur de la chaîne
charAt(i) Caractère à la position i
substring(start, end) Sous-chaîne
indexOf(s) Position première occurrence
contains(s) Contient la sous-chaîne ?
Java Avancé — Fiche de Révision GL2 INSAT Page 8
replace(old, new) Remplace toutes les occurrences
toLowerCase() / toUpperCase() Changement de casse
trim() Supprime espaces début/fin
equals() / equalsIgnoreCase() Comparaison (ne pas utiliser ==)
[Link]() Formatage (comme printf)
[Link]() Concaténation efficace (mutable)
■ 14. Héritage — Récapitulatif
• extends : héritage de classe (une seule classe parente en Java).
• super() : appel du constructeur parent — doit être la première instruction du constructeur enfant.
• [Link]() : appel d'une méthode de la classe parente.
• @Override : annotation indiquant la redéfinition d'une méthode parente.
• final sur classe = non héritable. Sur méthode = non redéfinissable.
• abstract : classe non instanciable avec méthodes sans corps, à implémenter dans les sous-classes.
• Si la classe enfant ne définit pas de constructeur, le compilateur appelle implicitement super() (constructeur sans arg du
parent).
Récap ordre d'init complet avec héritage :
static parent → static enfant → instance parent → constructeur parent → instance enfant → constructeur enfant
■ Cheatsheet Rapide — À mémoriser
Concept Essentiel à retenir
Thread start() ≠ run(). États: NEW→RUNNABLE→BLOCKED/WAITING→TERMINATED
Runnable Interface @FunctionalInterface avec run(). Découple tâche/thread
synchronized Sur méthode = verrou sur this. Sur bloc = verrou sur objet précis
wait/notify DANS un bloc synchronized. wait() relâche le verrou
Blocs init static: une fois au chargement. Instance: à chaque new, avant constructeur
Ordre init static parent → static enfant → inst parent → ctor parent → inst enfant → ctor enfant
GC Automatique. finalize() déprécié. [Link]() = suggestion ignorable
Serializable Interface marqueur. transient = exclu. static = exclu
Collections List=ordonné+doublons. Set=unique. Map=clé-valeur. Queue=FIFO
Boxing ordre Widening > Boxing > Var-args (JVM choisit le moins coûteux)
Exceptions checked=déclarée/attrapée. unchecked=RuntimeException. finally=toujours
Assertions assert cond : msg; Activées avec java -ea. Pas pour validation prod
Socket [Link]() côté serveur. new Socket(host,port) côté client
JTable TableModel(données) + JTable(vue). fireTableDataChanged() pour rafraîchir
■ Bonne chance pour ton examen ! GL2 · INSAT
Java Avancé — Fiche de Révision GL2 INSAT Page 9