Académique Documents
Professionnel Documents
Culture Documents
Programmation
Orientée Objet
Cours précédent
•Partie 1. L’héritage
▫La notion d’héritage
▫Accès d’une classe dérivée aux membres de sa classe de base
▫Construction des objets dérivés
▫Initialisation d’un objet dérivé
▫Dérivations successives
▫La notion de redéfinition d’une méthode
▫Redéfinition de méthode et dérivations successives
▫Surdéfinition et héritage
▫Contraintes portant sur la redéfinition
▫Duplication des champs
3
Cours précédent
•Partie 2. Le polymorphisme
▫La notion de polymorphisme
▫Les bases du polymorphisme
▫Généralisation du polymorphisme à plusieurs classes
▫Polymorphisme, redéfinition et surdéfinition
▫Conversion des arguments effectifs
▫Les règles de polymorphisme en java
▫Conversion explicite de référence
▫La super-classe Object
▫Héritage et tableaux
▫Polymorphisme et tableaux
▫Les classes abstraites
▫Les interfaces
Chapitre IV
Tableaux
• Un tableau est une structure de données qui stocke
une série de n valeurs de même type (élémentaire
ou objet)
▫ Il peut être utilisé comme une variable, un argument ou
un type de retour d’une méthode
Déclaration et Initialisation
• Pour définir un tableau d’entier on peut écrire:
int[] a; ou int a[];
▫ Cette instruction ne déclare que la variable « a »
• L’opérateur « new » crée le tableau:
a=new int[100];
int a[]=new int[100];
• On peut aussi créer un tableau et l’initialiser simultanément
avec ses valeurs
int[] nbrPremiers= {2, 3, 5, 7};
• Il est même possible d’initialiser un tableau anonyme:
new int[] {11, 13, 17, 19};
• Cette syntaxe est employée pour réinitialiser un tableau sans
créer une nouvelle variable
nbrPremiers =new int[] {11, 13, 17, 19};
7
• Remarque:
▫ Il est légal en Java d’avoir un tableau de taille 0, qui est
différent de null.
▫ Cela est utile dans le cas d’une méthode qui retourne un
tableau comme type de retour
8
nbr 31
7
Les deux variables font référence au même
tableau
9
• Exemple
int[] ta= {2, 3, 5, 7};
int[] tb={1,10,100,1000,1010,1100};
System.arraycopy(ta,1,tb,2, 3);
for (int i = 0; i < tb.length; i++)
System.out.print(tb[i]+" ");
• Résultat? 1 10 3 5 7 1100
10
Tableaux multidimensionnels
• Les tableaux multidimensionnels sont des tableaux de tableaux
• Parcours
for (int i = 0; i < mat.length; i++)
for (int j = 0; j < mat[i].length; j++)
System.out.print(mat[i][j]+" ");
11
Tableaux Irréguliers
• Un tableau irrégulier est un tableau
multidimensionnel où les différentes rangées ont
des longueurs différentes (sous tableaux de taille
différentes)
▫ Exemple: Matrice triangulaire
12
Tableaux Irréguliers
• Pour créer un tableau irrégulier (Ex. matrice
triangulaire) , nous commençons par créer le
tableau qui contient les rangées
▫ double[][] mat=new double[3][];
• Ensuite créer les rangées de la matrice triangulaire
for (int i = 0; i < mat.length; i++)
mat[i]= new int[i+1];
• Une fois le tableau alloué, nous pouvons remplir et
accéder à ses éléments à condition de ne pas
dépasser les limites de chaque sous tableau
13
Classe Arrays
• Le package java.util définit une classe, Arrays,
propose des méthodes statiques (de classe)
utilitaires pour travailler avec des tableaux d’objets
ou de types primitifs (les méthodes sont surchargées
pour tous les types primitifs)
▫ Comparer 2 tableaux : equals et deepEquals
▫ Représenter un tableau sous forme de String: toString
▫ Copier un tableau (depuis 1.6) : copyOf
Rappel : System.arraycopy permet de copier les éléments
d’un tableau dans un tableau existant
14
classe Arrays
• Des méthodes de recherche
▫ int binarySearch(char[ ] a) , int binarySearch(int[ ] a) …
int binarySearch(Object[ ] a)
• Des méthodes de tris
▫ sort(char[ ] a) , sort(int[ ] a) ….. sort(Object[ ] a)
▫ sort(char[ ] a, int fromIndex, int toIndex) , ...
• Des méthodes pour remplissage avec une valeur
▫ fill(char[ ] a, char val) , fill(int[ ] a, long val) …..
▫ fill(char[ ] a, int fromIndex, int toIndex, char val)…
• Des méthodes de test d’égalité
▫ boolean equals(char[ ] a1, char[ ] a2),
▫ boolean equals(int[ ] a1,int[ ] a2), …..
15
• Exemple:
double[] vec = new double[1000];
for (int i = 0; i < vec.length; i++)
vec[i] = Math.random()*1000;
// tri du tableau
Arrays.sort(vec);
16
Plan du cours
• Qu’est ce qu’une collection?
• Cadre des collections en Java
• Description des interfaces du framework
▫ Interface Collection
Parcourir une collection: les itérateurs
Les ensembles: interface Set
Les listes: interface List
Les Files: interface Queue
▫ Interface Map: Les tableaux associatifs
21
Les interfaces
• Le cadre est composé de 10 interfaces définies
dans le paquetage java.util. Chacune définie:
▫ un type (liste, ensemble, file, tableau associatif, etc.)
▫ les opérations disponibles sur ce type
▫ la sémantique des opérations (informelle: pas de code)
SortedSet Deque
26
ArrayList,
Tableau redimensionnable Vector (JDK
1.1)
Arbre TreeSet TreeMap
Liste chaînée LinkedList
HashMap,
Collection utilisant une table
HashSet HashTable
de hashage
(JDK 1.1)
Classes du JDK 1.1 Stack (pile)
29
Classes utilitaires
• La classe Collections (avec un s à la fin) fournit
des méthodes statiques pour, en particulier
▫ trier une collection
▫ faire des recherches rapides dans une collection triée
Exemple
Collection<String> l = new ArrayList<String>();
l.add("Mohammed Ahmed");
l.add("Meriem Mehdi");
l.add("Mehdi Khettab");
l.add("Ahmed Mohammed");
Collections.sort(l);
System.out.println(l);
int n=Collections.binarySearch(l, "Meriem
Mehdi");
System.out.println("Meriem Mehdi est à la
position "+n+" de la liste");
Résultat:
[Ahmed Mohammed, Mehdi Khettab, Meriem Mehdi, Mohammed Ahmed]
Meriem Mehdi est à la position 2 de la liste
32
L’Interface Collection
35
L’interface java.util.Collection
• L’interface Collection est la racine de l’arbre
d’héritage des structures de données de Java.
L’interface java.util.Collection
• Propriétés :
▫ Avant Java 1.5, les éléments d’une collection était
Object.
▫ Une collection peut autoriser ou non plusieurs
occurrences d’un même élément (List vs Set).
▫ Les éléments peuvent être triés ou non (Set vs
SortedSet).
▫ Toute réalisation d’une Collection doit définir :
un constructeur par défaut (qui crée une collection vide)
un constructeur qui prend en paramètre une collection
d’éléments de type compatible en paramètre
(conversion).
37
L’interface java.util.Collection<E>
public interface Collection<E> extends Iterable<E>{
// Operations Basiques
public int size();
public boolean isEmpty
public boolean contains (Object o);
public boolean add (E o);
public boolean remove(Object object
public Iterator<E> iterator();
…
//Opération sur les ensembles
public boolean containsAll (Collection<?> c);
public boolean addAll(Collection<? extends E> c);
public boolean removeAll(Collection<?> c);
public boolean retainAll(Collection<?> c) ;
public void clear ();
…
//Opérations sur les tableaux
public Object[] toArray();
public <T> T[] toArray(T[] a);
}
38
L’interface java.util.Collection
• Opérations basiques :
• size: retourne le nombre d’éléments dans la
collection
• isEmpty(): retourne true si la collection est vide
• contains (Object o) : retourne true si la collection
l’objet o (basé sur la méthode equals de la classe E)
• add (E o): ajoute l’élément o à la collection.
Retourne false si doubles interdits
• remove(Object object): supprime l’objet o
• iterator(): retourne l’itérateur de la collection
39
L’interface java.util.Collection<E>
• Exemple: Soit c une
référence vers une collection vide
c.contains(p1); //True
L’interface java.util.Collection<E>
• Si on redéfinit la méthode equals de Object dans la classe Point :
L’interface java.util.Collection
• Opérations sur les ensembles :
• containsAll (Collection<?> c): retourne true si la
collection contient tous les éléments de c (Les
éléments de c doivent être de type E ou un sous
type de E)
• addAll(Collection<? extends E> c): ajoute les
éléments de c (union)
• removeAll(Collection<?> c): supprim tous les
éléments de c (différence)
• retainAll(Collection<?> c): conserve les éléments de
c (intersection)
• clear (): supprimer tous les éléments de la collection
42
L’interface java.util.Collection
• Transformation en tableaux :
▫ toArray(): renvoie une instance de Object[] qui
contient les éléments de la collection
▫ T[] toArray(T[] a): renvoie un tableau d’un
type T compatible avec le type de la collection à
laquelle on passe en paramètre un tableau « a » du
type voulu:
si le tableau « a » est assez grand, les éléments de la
collection sont rangés dans le tableau
sinon, un nouveau tableau du même type est créé
pour recevoir les éléments de la collection
43
Transformation en Tableau
Exemple: Soit une collection « c » de String:
• Pour obtenir un tableau d’objets:
Object[] tableau = c.toArray();
Exemple
• Exemple de liste avec • Exemple de liste sans
(un)boxing (un)boxing (avant jdk5)
List<Integer> l = new List l = new ArrayList();
ArrayList<Integer>(); l.add(new Integer(10));
l.add(10); l.add(new Integer(-678));
l.add(-678); l.add(new Integer(87));
l.add(87); l.add(new Integer(7));
l.add(7); int i = l.get(0).intValue();
int i = l.get(0);
46
L’interface java.util.Iterator<E>
• Cette interface définit des méthodes pour des
objets capables de parcourir les données d'une
collection:
▫ boolean hasNext(): retourne true s'il reste au moins
un élément à parcourir dans la collection
▫ E next(): renvoie l'élément courant dans le
parcours et passe l'itérateur à l'élément suivant
(lance NoSuchElementException lorsqu’il n'y a plus
rien à renvoyer)
▫ void remove(): supprime le dernier élément
parcouru (next doit être appelé avant)
50
L’interface java.util.Iterator<E>
• Exemple: parcourir une collection
Collection<Point> c ;
….
Iterator<Point> it = c.iterator();
while (it.hasNext()) {
Point p1 = it.next(); // retourne l’élément
courant et avance
// manipuler élément...
}
51
L’interface java.util.Iterable<E>
• Il est aussi possible d’utiliser foreach pour
parcourir la collection
Iterable<E> collection = ......;
for (E o : collection){
…;
}
Les ensembles
Interface Set<E>
53
L’interface java.util.Set<E>
• Correspond à une collection qui ne contient pas 2
objets égaux au sens de equals (comme les
ensembles des mathématiques)
• Par exemple,
▫ la méthode add n’ajoute pas un élément si un
élément égal est déjà dans l’ensemble (la méthode
renvoie alors false)
55
• NavigableSet<E>
▫ Interface du JDK 6 dérivée de SortedSet
▫ Permet de naviguer dans un Set à partir d’un de ses
éléments, dans l’ordre du Set ou dans l’ordre inverse
56
Implémentations du Set
• HashSet<E> implémente Set avec une table de hachage ;
▫ Cette classe ne vérifie l’égalité que pour les objets qui ont le
même hashCode (méthode de la classe Object)
« 2 objets égaux au sens de equals doivent avoir la même valeur
pour la méthode hashCode »
Exemple
• On souhaite créer une classe AgenceBancaire
permettant de gérer un ensemble de comptes
bancaires.
• On souhaite pouvoir ajouter un compte, s’il
n’existe pas, supprimer un compte, rechercher
un compte par le nom du client, …
• Les comptes doivent être triés par leur numéro.
58
Exemple
public class Compte implements
Comaprable{
private String nom; public void supprimerCpt(Compte c){
private String numero; lesComptes.remove(c);
private double solde; }
//… public Compte rechercherCpt(String
public int compareTo(Object c) { nom){
String num=(Compte)c).getNum(); Compte c=null;
return this.numero.compareTo(num); Iterator<Compte> it =
} lesComptes.iterator();
}//fin de la classe Compte while (it.hasNext()){
c=it.next();
public class AgenceBancaire { if
private Set<Compte> lesComptes; (nom.equalsIgnoreCase(c.getNom()))
return c;
public AgenceBancaire () { }
lesComptes = new TreeSet<Compte>(); return null;
} }
public boolean ajouterCpt(Compte c){ //…
return lesComptes.add(c); }//fin de la classe Agence
}
60
Les listes
Interface List<E>
62
L’interface java.util.List<E>
• L’interface List<E> correspond à une collection
d’objets indexés par des numéros (en
commençant par 0)
Méthodes de List<E>
• E get(int i) : retourne l’élément à l’index i
• int indexOf(Object o) : indice du 1er élément égal à o (-1 sinon)
• int lastIndexOf(Object o) : dernier index de o dans la liste
• List<E> subList(int from, int to) : liste des éléments [from..to[
• ListIterator<E> listIterator() : itérateur double sens
• ListIterator<E> listIterator(int i) : itérateur initialisé à l’index i
• Optionnelles:
▫ void add(int i, E e): ajouter e à l’index i (insertion avec décalage droite)
▫ boolean addAll(int, Collection<? extend E> c) : insérer c à partir de i
▫ E remove(int i) : supprimer l’élément à l’index i (décalage gauche)
▫ E set(int i, E e): remplacer l'élément à la position i avec l'élément e
Implémentation de List
• ArrayList<E> : C’est comme un tableau redimensionnable dont la taille
croit lorsque des éléments sont ajoutés.
Exemple
public class Employe { public class Util{
private String leNom; public static void main(String [] args) {
private String lePrenom; ArrayList <Employe> tableauEmployes =
new ArrayList <Employe>();
private double leSalaire;
Employe emp1 = new Employe(“Hadi","Mohamed");
Employe emp2 = new Employe("Amine", "Mehdi");
public Employe (String tableauEmployes.add(emp1);
unNom, String unPrenom) { tableauEmployes.add(emp2);
leNom = unNom; //…
lePrenom = unPrenom; if (!tableauEmployes.isEmpty()) {
for (int i = 0; i<tableauEmployes.size(); i++){
}
System.out.println("Employe :"+
public String getNom() tableauEmployes.get(i).getNom());
{ }
return leNom; tableauEmployes.remove(1);
} }
} }
Les Files
Interface Queue<E>
70
Implémentations de Queue<E>
• LinkedList<E>, déjà vu
• PriorityQueue<E> : les éléments sont
ordonnés automatiquement
▫ L’élément récupéré en tête de queue est le plus
petit
• D’autres classes et interfaces sont liées aux
problèmes de concurrence (multi-threads)
• Pour plus de détails, consultez l’API
73
Exemple
public static void compteur(int n)
throws InterruptedException {
Queue<Integer> queue = new LinkedList<Integer>();
Interface Deque<E>
• Sous interface de Queue<E> (ajouté au JDK 1.6)
• Représente une Queue dont les éléments peuvent être
ajoutés « aux 2 bouts » (la tête et la queue de la collection)
Interface Deque<E>
• Quand une « deque » est utilisée comme une file, c’est une
file de type FIFO qui est gérée (addLast(e), offerLast(e),
removeFirst(), pollFirst(), getFirst(), peekFirst())
Exemple
import java.util.*;
Problème fréquent
• Il arrive souvent en informatique d’avoir à
rechercher des informations en connaissant une
clé qui permet de les identifier
▫ Par exemple, on connaît un nom et on cherche un
numéro de téléphone
▫ ou on connaît un numéro de matricule et on cherche
les informations sur l’étudiant qui a ce matricule
Map : Exemple
Créer un objet
Map.Entry référençant
s1 et pt1
Ranger cette
Map.Entry dans la
table à une position
qui dépend de la clé s1
81
Méthodes de Map<K,V>
• V put(K k, V v) : ajouter v avec la clé k : retourne l’ancienne valeur
associée à la clé si la clé existait déjà
• V get(Object k) : retourne la valeur associée à la clé ou null
• V remove(Object k) : supprimer l’entrée associée à k
• boolean containsKey(Object k) : retourne true si la clé k est utilisée
• boolean containsValue(Object v) : retourne true si v existe dans la
map
• void putAll(Map<? extends K,? extends V> m) : ajouter les entrées de m
• int size() : retourne le nombre d’entrées dans la table
• boolean isEmpty() : retourne true si la map est vide
• void clear() : vide la map
82
Parcours des Map
• Parcourir les clés de la Map
Map<Key, Value> map;
for (Key key : map.keySet()) { // manipuler key... }
Ou
for (Map.Entry<Key, Value> entry : map.entrySet())
{
Key key = entry.getKey();
Value value = entry.getValue();
// ...
}
85
Implémentations
86
Sous Interfaces
• Interface SortedMap<K,V>
▫ C’est un Map qui fournit un ordre total sur ses clés(ordre naturel
sur K ou comparateur associé à la Map)
▫ Ajoute à Map des méthodes pour extraire des sous-map, la 1ère ou la
dernière clé (semblable à SortedSet)
• Interface NavigableMap<K,V>
▫ Ajoute des fonctionnalités à un SortedMap
▫ Permet de naviguer à partir d’une de ses clés, dans l’ordre du Set ou
dans l’ordre inverse
Implémentations
• HashMap<K,V>
▫ Structure de données qui permet de retrouver très rapidement un
objet si on connaît sa clé (accès en temps constant)
▫ En interne l’accès aux objets utilise un tableau et une fonction de
hachage appliquée à la clé
▫ La méthode hashCode() (héritée de Object ou redéfinie) est utilisée
comme fonction de hachage
• TreeMap<K,V>
▫ arbre ordonné suivant les valeurs des clés
▫ Implémente NavigableMap<K,V> ;
▫ La comparaison utilise l’ordre naturel (interface Comparable<?
super K>) ou une instance de Comparator<? super K> fournit
au constructeur)
88