0% ont trouvé ce document utile (0 vote)
1 vues9 pages

Java Revision GL2 INSAT

Transféré par

ameniprof
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
1 vues9 pages

Java Revision GL2 INSAT

Transféré par

ameniprof
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi