Académique Documents
Professionnel Documents
Culture Documents
13-Collections 2023 en Java Partie1
13-Collections 2023 en Java Partie1
en Java
L. HASSOUNI 2
Qu’est ce qu’une collection(2)?
Une collection, parfois appelée conteneur, est simplement un objet qui
regroupe plusieurs éléments (objets) en une seule unité.
Les collections sont utilisées pour stocker, récupérer, manipuler et
communiquer des données agrégées.
En règle générale, ils représentent des éléments de données qui forment
un groupe naturel, comme une main de poker (une collection de cartes),
un dossier de courrier (une collection de lettres) ou un annuaire
téléphonique (une mise en correspondance de noms avec des numéros
de téléphone).
3
Qu’est ce que le framework Collections?
• Un framework de collections est une architecture unifiée pour représenter
et manipuler des collections. Tous les frameworks de collections
contiennent les éléments suivants :
• Interfaces: Ce sont des types de données abstraits qui représentent des
collections. Les interfaces permettent de manipuler les collections
indépendamment des détails de leur représentation. Dans les langages
orientés objet, les interfaces forment généralement une hiérarchie.
• Implémentations : Ce sont les implémentations concrètes des interfaces
de collection. Ce sont essentiellement des structures de données
réutilisables.
• Algoritmes : Ce sont les méthodes qui effectuent des calculs utiles, tels
que la recherche et le tri, sur des objets qui implémentent des interfaces
de collection.
Les algorithmes sont dits polymorphes : c'est-à-dire que la même méthode
peut être utilisée sur de nombreuses implémentations différentes de
l'interface de collection appropriée.
En substance, les algorithmes sont des fonctionnalités réutilisables.
L. HASSOUNI 4
Interfaces du FrameWork Collections
• Les interfaces de base du Framework encapsulent différents
types de collections, qui sont illustrés dans la figure qui suit.
• Ces interfaces permettent de manipuler des collections
indépendamment des détails de leur représentation.
• Les interfaces de base sont à la base du Framework
Collections et forment une hiérarchie.
L. HASSOUNI 5
Les interfaces de base du Framework collections
6
Hiérarchie des Collections
7
• Un Set est un type spécial de Collection, un SortedSet est un type
spécial de Set, et ainsi de suite.
L. HASSOUNI 8
• La syntaxe <E> vous indique que l'interface est générique.
l'exécution.
L. HASSOUNI 9
• Lorsque vous comprendrez comment utiliser ces interfaces, vous saurez
• Dans ce qui suit nous allons traiter des directives générales pour une
interface.
L. HASSOUNI 10
• Pour que le nombre d'interfaces de base reste gérable, la plate-forme
Java ne fournit pas d'interfaces distinctes pour chaque variante de
chaque type de collection. (Ces variantes peuvent être immuable, de
taille fixe et d'ajout uniquement.)
• Au lieu de cela, les opérations de modification dans chaque interface
sont désignées facultatives — une implémentation donnée peut
choisir de ne pas prendre en charge toutes les opérations.
• Si une opération non prise en charge est invoquée, une collection lève
une exception qui est UnsupportedOperationException.
• Les implémentations sont chargées de documenter les opérations
facultatives qu'elles prennent en charge.
• Toutes les implémentations à usage général de la plate-forme Java
prennent en charge toutes les opérations facultatives.
L. HASSOUNI 11
• La liste suivante décrit les interfaces de base :
• Collection : la racine de la hiérarchie des collections.
• Une collection représente un groupe d'objets appelés ses
éléments.
• L'interface Collection est le plus grand diviseur commun que
toutes les collections implémentent et est utilisée pour faire
circuler des collections et les manipuler lorsqu'une généralité
maximale est souhaitée.
• Certains types de collections autorisent les éléments en double,
d'autres non. Certains sont ordonnés et d'autres non ordonnés.
• La plate-forme Java ne fournit aucune implémentation directe de
cette interface mais fournit des implémentations de sous-
interfaces plus spécifiques, telles que Set et List.
L. HASSOUNI 12
• Set :
L. HASSOUNI 13
• List:
L. HASSOUNI 14
• Queue: (File d’attente)
• une collection utilisée pour contenir plusieurs éléments avant le traitement.
• Outre les opérations de base, une Queue fournit des opérations d'insertion,
d'extraction et d'inspection supplémentaires.
• Les files d'attente classent généralement, mais pas nécessairement, les éléments de
manière FIFO (premier entré, premier sorti).
• Parmi les exceptions figurent les files d'attente prioritaires, qui classent les éléments
en fonction d'un comparateur fourni ou de l'ordre naturel des éléments.
• Quel que soit l'ordre utilisé, la tête de file d'attente est l'élément qui serait supprimé
par un appel à remove ou à poll.
• Dans une file d'attente FIFO, tous les nouveaux éléments sont insérés en queue de
file d'attente.
• D'autres types de files d'attente peuvent utiliser des règles de placement différentes.
• Chaque implémentation de file d'attente doit spécifier ses propriétés de commande
L. HASSOUNI 15
• Deque:
• une collection utilisée pour contenir plusieurs éléments avant le
traitement.
• Outre les opérations de collecte de base, un Deque fournit des
opérations d'insertion, d'extraction et d'inspection
supplémentaires.
• Deque peut être utilisé à la fois comme FIFO (premier entré,
premier sorti) et LIFO (dernier entré, premier sorti).
• Dans un deque, tous les nouveaux éléments peuvent être insérés,
récupérés et supprimés aux deux extrémités
L. HASSOUNI 16
• Map:
bases de Map.
L. HASSOUNI 17
• Les deux dernières interfaces sont simplement des
versions triées de Set et Map :
• SortedSet:
• un ensemble qui conserve ses éléments dans l'ordre croissant.
• Plusieurs opérations supplémentaires sont prévues pour profiter de
la commande.
• Les ensembles triés sont utilisés pour les ensembles naturellement
ordonnés, tels que les listes de mots et les listes d'adhésion
• SortedMap:
• une Map qui conserve ses mappages dans l'ordre croissant des
clés.
• C'est l'analogue Map de SortedSet.
• Les Maps triées sont utilisées pour les collections naturellement
ordonnées de paires clé/valeur, telles que les dictionnaires et les
annuaires téléphoniques
L. HASSOUNI 18
• L'avantage de spécifier une structure de données par une interface
est de permettre plusieurs implémentations différentes d'une même
structure.
• Le Framework des collections fournit des classes qui implémentent
ces interfaces.
• Il est recommandé d'utiliser une interface pour déclarer un objet
collection plutôt que la classe qui implémente l'interface.
• Par exemple pour déclarer un objet collection liste, il est recommandé
d'utiliser :
List <String> noms = new ArrayList<>();
Plutôt que:
ArrayList<String> noms = new ArrayList<>();
L. HASSOUNI 19
L'interface <<Collection>>
• L'interface Collection est la racine du Framework des collections. Elle
définit une collection générique.
• Le Framework des collections ne fournit pas de classes qui
implémente l'interface Collection.
• L'interface Collection définit le type collection le plus générique et
peut être passé comme paramètre aux méthodes.
• L'interface Collection déclare un ensemble de méthodes qui sont
héritées par tous les autres interfaces collections.
L. HASSOUNI 20
<<interface>>
<<interface>>
Méthode de l'interface Iterable Collection<T>
L. HASSOUNI 21
API Collection
• Les méthodes de l'interface Collection peuvent être réparties en les
opérations suivantes:
➢Opérations basiques
➢Opérations vrac
➢Opérations d'agregats
➢Opérations tableaux
➢Opérations de comparaison
L. HASSOUNI 22
L. HASSOUNI 23
Méthodes pour opérations basiques
boolean add(E e)
Ensures that this collection contains the specified element (optional operation).
void clear()
Removes all of the elements from this collection (optional operation).
boolean contains(Object o)
Returns true if this collection contains the specified element.
boolean remove(Object o)
Removes a single instance of the specified element from this collection, if it is present (optional operation).
boolean isEmpty()
Returns true if this collection contains no elements.
int size()
Returns the number of elements in this collection.
L. HASSOUNI 24
package collectionbasicop;
import java.util.ArrayList;
import java.util.Collection;
if(noms.isEmpty()){
System.out.println("Collection vide");
}else{
System.out.println("Collection non vide");
}
noms.add("Moha");
noms.add("Toto");
noms.add("Manolo");
noms.add("Moha");
System.out.println("Elements : " + noms + " Taille : " + noms.size());
L. HASSOUNI 25
noms.remove("Manolo");
System.out.println("Elements : " + noms + " Taille : " + noms.size());
if(noms.contains("Manolo")){
System.out.println("Manolo est contenu dans la liste");
}else{
System.out.println("Manolo n'est pas contenu dans la liste");
}
noms.remove("Moha");
System.out.println("Elements : " + noms + " Taille : " + noms.size());
noms.clear();
System.out.println("Elements : " + noms + " Taille : " + noms.size());
}
}
Résultats exécution:
Collectioon vide
Elements : [Moha, Toto, Manolo, Moha] Taille : 4
Elements : [Moha, Toto, Moha] Taille : 3
Manolo n'est pas contenu dans la liste
Elements : [Toto, Moha] Taille : 2
Elements : [] Taille : 0
L. HASSOUNI 26
package collectionbasicop;
import java.util.ArrayList;
import java.util.Collection;
public class OperationsBasiques {
public static void main(String[] args) {
Collection<String> noms = new ArrayList<>();
if(noms.isEmpty()){ System.out.println("Collectioon vide"); }
else{System.out.println("Collectioon non vide"); }
noms.add("Moha");
noms.add("Toto");
noms.add("Manolo");
noms.add("Moha");
System.out.println("Elements : " + noms + " Taille : " + noms.size());
noms.remove("Manolo");
System.out.println("Elements : " + noms + " Taille : " + noms.size());
if(noms.contains("Manolo")){ System.out.println("Manolo est contenu dans la liste"); }
else{System.out.println("Manolo n'est pas contenu dans la liste"); }
noms.remove("Moha");
System.out.println("Elements : " + noms + " Taille : " + noms.size());
noms.clear();
System.out.println("Elements : " + noms + " Taille : " + noms.size());
}
}
L. HASSOUNI 27
Méthodes pour opérations vrac
boolean addAll(Collection<? extends E> c)
Adds all of the elements in the specified collection to this collection (optional operation).
boolean retainAll(Collection<?> c)
Retains only the elements in this collection that are contained in the specified collection (optional operation).
boolean containsAll(Collection<?> c)
Returns true if this collection contains all of the elements in the specified collection.
boolean removeAll(Collection<?> c)
Removes all of this collection's elements that are also contained in the specified collection (optional operation).
L. HASSOUNI 28
package collectionbasicop;
import java.util.ArrayList;
import java.util.Collection;
sportifs.add("Aouita");
sportifs.add("Moutawakkil");
footballeurs.add("Zaki");
footballeurs.add("Bouderbala");
joueursTennis.add("El Aynaoui");
joueursTennis.add("Arazi");
joueursTennis.add("Alami");
L. HASSOUNI 29
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.addAll(footballeurs);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
if(sportifs.containsAll(footballeurs)){
System.out.println("Les footballeurs sont inclus dans la liste des sportifs");
}
sportifs.retainAll(footballeurs);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.retainAll(joueursTennis);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.addAll(footballeurs);
sportifs.addAll(joueursTennis);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.removeAll(footballeurs);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
L. HASSOUNI 31
package collectionbasicop;
import java.util.ArrayList;
import java.util.Collection;
public class OperationsVrac {
public static void main(String[] args){
Collection<String> sportifs = new ArrayList<String>();
Collection<String> footballeurs = new ArrayList<>();
Collection<String> joueursTennis = new ArrayList<String>();
sportifs.add("Aouita");
sportifs.add("Moutawakkil");
footballeurs.add("Zaki");
footballeurs.add("Bouderbala");
joueursTennis.add("El Aynaoui");
joueursTennis.add("Arazi");
joueursTennis.add("Alami");
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.addAll(footballeurs);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
if(sportifs.containsAll(footballeurs)){
System.out.println("Les ffotballeurs sont inclus dans la liste des sportifs");
}
sportifs.retainAll(footballeurs);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.retainAll(joueursTennis);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.addAll(footballeurs);
sportifs.addAll(joueursTennis);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.removeAll(footballeurs);
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
sportifs.removeIf((String e)->{return e.length()<6;});
System.out.println("Sportifs : " + sportifs + " NbSportifs : " + sportifs.size() );
}}
L. HASSOUNI 32
Méthodes pour opérations de comparaison
boolean equals(Object o)
Compares the specified object with this collection for equality.
int hashCode()
Returns the hash code value for this collection.
package collectionbasicop;
import java.util.ArrayList;
import java.util.Collection;
public class OperationsComparaison {
public static void main(String[] args){
Collection<String> sportifs = new ArrayList<>();
Collection <String> joueursTennis = new ArrayList<>();
sportifs.add("El Aynaoui");
sportifs.add("Arazi");
sportifs.add("Alami");
joueursTennis.add("El Aynaoui");
joueursTennis.add("Arazi");
L. HASSOUNI 33
if(sportifs.equals(joueursTennis)){
System.out.println("sportifs = joueursTennis");
}else{
System.out.println("sportifs # joueursTennis");
} Exécution
joueursTennis.add("Alami"); sportifs # joueursTennis
if(sportifs.equals(joueursTennis)){ sportifs = joueursTennis
System.out.println("sportifs = joueursTennis"); 189160881
}else{ 189160881
System.out.println("sportifs # joueursTennis"); -1416950800
}
System.out.println(sportifs.hashCode());
System.out.println(joueursTennis.hashCode());
int tothc = 0;
for(String e : sportifs){
tothc += e.hashCode();
}
System.out.println(tothc);
}
}
L. HASSOUNI 34
package collectionbasicop; Exécution
import java.util.ArrayList; sportifs # joueursTennis
import java.util.Collection; sportifs # joueursTennis
public class OperationsComparaison2 { -1183176409
public static void main(String[] args){ -1874243739
Collection<StringBuilder> sportifs = new ArrayList<>(); -80390400
Collection <StringBuilder> joueursTennis = new ArrayList<>();
sportifs.add(new StringBuilder("El Aynaoui"));
sportifs.add(new StringBuilder("Arazi"));
sportifs.add(new StringBuilder("Alami"));
joueursTennis.add(new StringBuilder("El Aynaoui"));
joueursTennis.add(new StringBuilder("Arazi"));
if(sportifs.equals(joueursTennis)){System.out.println("sportifs = joueursTennis");}
else{System.out.println("sportifs # joueursTennis");}
joueursTennis.add(new StringBuilder("Alami"));
if(sportifs.equals(joueursTennis)){System.out.println("sportifs = joueursTennis");}
else{System.out.println("sportifs # joueursTennis");}
System.out.println(sportifs.hashCode());
System.out.println(joueursTennis.hashCode());
int tothc = 0;
for(StringBuilder e : sportifs){tothc += e.hashCode();}
System.out.println(tothc);
}}
L. HASSOUNI 35
Méthodes pour opérations tableaux
Object[] toArray()
Returns an array containing all of the elements in this collection.
<T> T[] toArray(T[] a)
Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the
specified array.
L. HASSOUNI 36
Exécution
package collectionbasicop; El Aynaoui
import java.util.ArrayList; Arazi
import java.util.Collection; Alami
public class OperationsToArray { ================
public static void main(String[] args){ El Aynaoui
Collection<String> sportifs = new ArrayList<>(); Arazi
sportifs.add("El Aynaoui"); Alami
sportifs.add("Arazi");
sportifs.add("Alami");
System.out.println("==================================");
String[] stringArraySportifs = sportifs.toArray(new String[sportifs.size()]);
for(String e : stringArraySportifs){System.out.println(e);}
}
}
L. HASSOUNI 37
Méthodes pour opérations d'agrégats
default Stream<E> stream()
L. HASSOUNI 38
Méthodes pour parcourir (ou travaverser) une collection
Iterator<E> iterator()
Returns an iterator over the elements in this collection.
L. HASSOUNI 39
Utilisation d'un Iterator
API Iterator
default void forEachRemaining(Consumer<? super E> action)
Performs the given action for each remaining element until all elements have been processed or the action throws an
exception.
boolean hasNext()
Returns true if the iteration has more elements.
E next()
L. HASSOUNI 40
• Une collection possède la méthode Iterator<E> iterator() qui lui
permet d'obtenir un objet Iterator pour parcourir tous les éléments de
la dite collection.
• Un objet Iterator peut exécuter les méthodes de l'interface Iterator.
• Ces méthodes, comme le montre le tableau API Iterator, sont :
• hasNext() : teste s'il y a un élément qui n'a pas été accédé.
• next() : retourne l'élément suivant de la collection. Nous devons toujours
exécuter next() après le succès d'un hasNext(), sinon next() lance l'exception
NoSuchElementException.
• Remove() : supprime l'élément de la liste qui vient d'être retourné par next().
Remove() doit être appelé une seule fois pour chaque appel de next().
Si la méthode remove() est appellée plus d'une fois pour un appel de next(), ou
avant le premier appel de next(), elle lance l'exception IllegalStateException.
Le support de la methode remove() est optionnel. Remove() peut lancer
l'exception UnsupportedOperationException.
L. HASSOUNI 41
Parcours d'une collection : Iterator , hasNext() et next()
Exécution
package collectionbasicop;
Aouita
import java.util.ArrayList; Guerrouj
import java.util.Collection; Bidouane
import java.util.Iterator;
sportifs.add("Aouita");
sportifs.add("Guerrouj");
sportifs.add("Bidouane");
L. HASSOUNI 45
Parcours d'une collection avec la boucle for-each
package collectioniterator; Aouita
import java.util.ArrayList; Guerrouj
import java.util.Collection; Bidouane
import java.util.Iterator;
java.util.ConcurrentModificationException
Aouita
Exécution
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.ConcurrentModificationException;
public class CollectionForEachLoopRemove {
public static void main(String[] args){
Collection<String> sportifs = new ArrayList<>();
sportifs.add("Aouita");
sportifs.add("Guerrouj");
sportifs.add("Bidouane");
try{
for (String elt : sportifs){
System.out.println(elt);
sportifs.remove(elt);
}
}catch(ConcurrentModificationException e){
System.out.println(e);
}
}
}
L. HASSOUNI 47
Application d'une action sur chaque élément d'une collection
iterator.forEachRemaining(action)
package collectioniterator;
Exécution
import java.util.ArrayList;
import java.util.Collection; Aouita
import java.util.Iterator; Guerrouj
Bidouane
public class CollectionIteratorForEachRemaining {
public static void main(String[] args){
Collection<String> sportifs = new ArrayList<>();
sportifs.add("Aouita");
sportifs.add("Guerrouj");
sportifs.add("Bidouane");
}
L. HASSOUNI 48
}
API de l'interface fonctionnel Consumer<T>
@FunctionalInterface
public interface Consumer<T>
Représente une opération qui accepte un seul argument et ne retourne pas de résultat.
Comme tout interface fonctionnel, il peut être cible d'une affectation par une lambda expression
ou une référence de méthode "method reference".
L. HASSOUNI 49
import java.util.function.Consumer;
public class ConsumerDemo1 {
L. HASSOUNI 50
import java.util.function.Consumer;
public class ConsumerDemo2 {
public static void main(String[] args) {
L. HASSOUNI 51
Application d'une action sur chaque élément d'une collection
iterator.forEachRemaining(action)
package collectioniterator;
import java.util.ArrayList;
import java.util.Collection; Exécution
import java.util.Iterator;
Elt :Aouita Long : 6
public class CollectionIteratorForEachRemaining2 { Elt :Guerrouj Long : 8
public static void main(String[] args){ Elt :Bidouane Long : 8
Collection<String> sportifs = new ArrayList<>();
sportifs.add("Aouita");
sportifs.add("Guerrouj");
sportifs.add("Bidouane");
L. HASSOUNI 53
package collectioniterator;
import java.util.ArrayList;
import java.util.Collection;
sportifs.add("Aouita");
sportifs.add("Guerrouj");
sportifs.add("Bidouane");
sportifs.forEach(System.out::println);
System.out.println("==============================");
sportifs.forEach((String e)->{System.out.println("Elt :" + e +
"\tLong : "+e.length());});
}
}
L. HASSOUNI 54
<<interface>>
Iterable<T>
Collection List
<<interface>>
• Une Liste est une collection non ordonnée d'objets Collection<T>
définie par l'interface List du framework Collection.
• Une liste peut avoir des éléments duppliqués. <<interface>>
Elle peut aussi stocker plusieurs valeurs null. List<T>
int indexOf(Object o)
Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain
the element.
int lastIndexOf(Object o)
Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain
the element.
L. HASSOUNI 60
Méthodes spécifique à une liste(2)
ListIterator<E> listIterator()
Returns a list iterator over the elements in this list (in proper sequence).
E remove(int index)
Removes the element at the specified position in this list (optional operation).
boolean removeAll(Collection<?> c)
Removes from this list all of its elements that are contained in the specified collection (optional operation).
L. HASSOUNI 62
ArrayList vs LinkedList
• ArrayList et LinkedList sont deux classes du Framework Collection qui implémentent
l'interface List.
• Une ArrayList est stokée dans un tableau dynamique.
• Une LinkedList est stockée sous forme de liste chaînée.
• Une ArrayList offre de meilleures performances lorsqu'on accède fréquemment aux
éléments de la liste. L'accès aux éléments se fait plus rapidément puisqu'une ArrayList
est sauvegardée dans un tableau.
• L'ajout et la suppression d'un élément d'une ArrayList se fait plus lentement à moins que
l'opération ne s'effectue à la fin de la liste, ceci parce qu'une ArrayList doit effectuer une
copie de tableau interne pour garder les éléments en séquence.
• Une LinkedList offre de meilleures performances qu'une ArrayList pour les opérations
d'ajout et de suppression à partir du milieu de la liste. Cependant, une LinkedList est plus
lente pour accéder aux éléments à moins que ça se passe en tête de la liste.
L. HASSOUNI 63
package ListExemples;
import java.util.ArrayList;
import java.util.List;
public class ListExemple01 {
public static void main(String[] args) {
List<String> langages = new ArrayList<>();
langages.add("C");
langages.add("C++");
langages.add("Java");
L. HASSOUNI 65
<<interface>>
Parcours d'une liste avec ListIterator Iterator<T>
boolean hasPrevious()
Returns true if this list iterator has more elements when traversing the list in the reverse direction.
int nextIndex()
Returns the index of the element that would be returned by a subsequent call to next().
E previous()
Returns the previous element in the list and moves the cursor position backwards.
int previousIndex()
Returns the index of the element that would be returned by a subsequent call to previous().
Void set(E e)
Replaces the last element returned by next() or previous() with the specified element (optional operation).
L. HASSOUNI 67
Parcours d'une liste dans les deux directions avec ListIterator
package ListExemples;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListListIterator {
public static void main(String[] args) {
List<String> langagesFonctionnels = new ArrayList<>();
langagesFonctionnels.add("Lisp");
langagesFonctionnels.add("Prolog");
langagesFonctionnels.add("Clojure");
langagesFonctionnels.add("Haskel");
System.out.println("Langages: " + langagesFonctionnels);
ListIterator<String> iteratorGlobal = langagesFonctionnels.listIterator();