Académique Documents
Professionnel Documents
Culture Documents
Les Ensemble en Java
Les Ensemble en Java
- EnumSet : Spécialisé pour les ensembles contenant des éléments d'une énumération.
• Chaque fois qu’on introduit un nouvel élément dans une collection de type HashSet ou
TreeSet ou encore LinkedHashSet, il est nécessaire de s’assurer qu’il n’y figure pas déjà, il
faudra alors se préoccuper des méthodes equals() et compareTo(); equals() est utilisé
pour garantir l'unicité des éléments dans tous les types d'ensembles (HashSet, TreeSet,
LinkedHashSet), tandis que compareTo() est spécifique à TreeSet pour maintenir un ordre
spécifique des éléments.
• Un ensemble est une structure de données qui permet de stocker un groupe d'éléments de
manière non ordonnée et sans éléments dupliqués. Contrairement aux listes, les
ensembles ne garantissent pas un ordre spécifique des éléments et ne permettent pas la
duplication des éléments.
• Les ensembles sont utiles lorsque vous avez besoin de stocker des éléments uniques et
que l'ordre des éléments n'est pas important. Par exemple, lorsque vous souhaitez
maintenir une liste d'utilisateurs uniques ou une liste de mots-clés uniques.
• Les listes, en revanche, permettent de stocker des éléments dans un ordre spécifique et
autorisent la duplication des éléments. Elles sont utilisées lorsque vous avez besoin de
maintenir un ordre précis des éléments ou de permettre des duplications. Par exemple,
lorsque vous souhaitez conserver l'ordre des tâches à effectuer ou lorsque vous autorisez
plusieurs entrées de la même valeur.
• Suppression des doublons : Par exemple, si vous avez une liste d'adresses e-mail et que
vous souhaitez vous assurer qu'aucune adresse n'apparaît deux fois, vous pouvez utiliser
un ensemble pour stocker les adresses uniques
• Gestion des autorisations : Dans les systèmes de gestion des autorisations, les ensembles
peuvent être utilisés pour représenter les autorisations accordées à un utilisateur.
• Calcul d'intersection ou d'union : Les ensembles peuvent être utilisés pour calculer des
opérations ensemblistes telles que l'intersection, l'union, la différence, etc. Par exemple, si
vous avez deux ensembles de mots-clés et que vous souhaitez trouver les mots-clés
communs aux deux ensembles, vous pouvez calculer l'intersection des ensembles
• Les éléments ajoutés dans une collection de type Set doivent réimplémenter leurs
méthodes equals() et hashCode(). Ces méthodes sont utilisées lors de l'ajout d'un élément
pour déterminer s'il est déjà présent dans la collection. La valeur retournée par hashCode()
est recherchée dans la collection :
❑ Si aucun objet de la collection n'a la même valeur de hachage alors l'objet n'est pas
encore dans la collection et peut être ajouté
❑ Une collection de type Set peut contenir un objet null mais cela dépend des
implémentations. Certaines d'entre-elles ne permettent pas l'ajout de null.
L'interface définit plusieurs méthodes parmi lesquelles nous pouvons citer :
Méthode Rôle
Ajouter l'élément fourni en paramètre à la collection si celle-ci ne le contient pas déjà et
boolean add(E e) renvoyer un booléen qui précise si la collection a été modifiée (l'implémentation de cette
opération est optionnelle)
boolean Ajouter tous les éléments de la collection fournie en paramètre à la collection si celle-ci ne
addAll(Collection<? les contient pas déjà et renvoyer un booléen qui précise si la collection a été modifiée
extends E> c) (l'implémentation de cette opération est optionnelle)
Retirer tous les éléments de la collection (l'implémentation de cette opération est
void clear()
optionnelle)
boolean contains(Object
Renvoyer un booléen qui précise si la collection contient l'élément fourni en paramètre
o)
boolean
Renvoyer un booléen qui précise si tous les éléments de la collection fournie en paramètre
containsAll(Collection<?>
sont contenus dans la collection
c)
Comparer l'égalité de la collection avec l'objet fourni en paramètre. L'égalité est vérifiée si
boolean equals(Object
l'objet est de type Set, que les deux collections ont le même nombre d'éléments et que
o)
chaque élément d'une collection est contenu dans l'autre
int hashCode() Retourner la valeur de hachage de la collection
boolean isEmpty() Renvoyer un booléen qui précise si la collection est vide
Renvoyer un tableau des éléments de la collection dont le type est celui fourni en
<T> T[] toArray(T[] a)
paramètre
La classe HashSet présente plusieurs caractéristiques :
• Elle ne propose aucune garantie sur l'ordre de parcours lors de l'itération sur les éléments
qu'elle contient
• Elle ne permet pas d'ajouter des doublons mais elle permet l'ajout d'un élément null
Créer une nouvelle instance vide dont la HashMap interne utilisera une capacité initiale et
HashSet()
un facteur de charge par défaut
HashSet(Collection<?
Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
extends E> c)
HashSet(int Créer une nouvelle instance vide dont la HashMap interne utilisera la capacité initiale
initialCapacity) fournie en paramètre et un facteur de charge par défaut
HashSet(int
Créer une nouvelle instance vide dont la HashMap interne utilisera la capacité initiale et un
initialCapacity, float
facteur de charge par défaut
loadFactor)
• Le LinkedHashSet est une version ordonnée de HashSet qui maintient une liste à double lien
sur tous les éléments.
• Lorsque l’ordre d’itération doit être maintenu, cette classe est utilisée. Lors de l’itération
dans un HashSet , l’ordre est imprévisible, tandis qu’un LinkedHashSet nous permet de
parcourir les éléments dans l’ordre dans lequel ils ont été insérés.
• Lorsque vous parcourez LinkedHashSet à l’aide d’un itérateur, les éléments seront renvoyés
dans l’ordre dans lequel ils ont été insérés.
• Cette classe permet d'insérer des éléments dans n'importe quel ordre et de restituer. dans
un ordre précis lors de son parcours.
• L'ordre des éléments de la collection peut être défini par deux moyens :
❑ L’ordre obtenu par l'utilisation d'une instance de type Comparator fournie en paramètre
du constructeur de la collection
❑ La classe TreeSet utilise un arbre binaire pour stocker ses éléments. Chaque élément est
encapsulé dans un noeud (node).
❑ Si un noeud fait référence à un ou deux autres noeuds alors il est le noeud parent de ses
noeuds fils
❑ Un des deux noeuds contient toujours un élément dont la valeur est plus petite
❑ C’est toujours le même noeud qui doit contenir la valeur la plus petite et l'autre la valeur la
plus grande
5
3 9
1 4 6 7
2 5
La classe TreeSet possède plusieurs constructeurs :
Constructeur Rôle
TreeSet() Créer une instance vide dont l'ordre naturel de tri de ses éléments est utilisé
TreeSet(Collection<? extends Créer une instance contenant les éléments de la collection fournie en paramètre dont l'ordre naturel de tri de
E> c) ses éléments est utilisé
TreeSet(Comparator<? super Créer une instance vide dont l'ordre utilisé est celui définit par l'instance de type Comparator fournie en
E> comparator) paramètre
Créer une instance contenant les éléments de la collection fournie en paramètre dont l'ordre est celui utilisé
TreeSet(SortedSet<E> s)
par la collection
La classe HashSet présente plusieurs caractéristiques :
Constructeur Rôle
ConcurrentSkipListSet() Créer une nouvelle instance vide dont les éléments sont triés avec leur ordre naturel
ConcurrentSkipListSet(C Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
ollection<? extends E> c) triés avec leur ordre naturel
ConcurrentSkipListSet(C
Créer une nouvelle instance vide dont les éléments sont triés en utilisant l'instance de type
omparator<? super E>
Comparator fournie en paramètre
comparator)
ConcurrentSkipListSet(So Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
rtedSet<E> s) triés selon l'ordre de cette collection
La classe HashSet présente plusieurs caractéristiques :
Constructeur Rôle
ConcurrentSkipListSet() Créer une nouvelle instance vide dont les éléments sont triés avec leur ordre naturel
ConcurrentSkipListSet(C Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
ollection<? extends E> c) triés avec leur ordre naturel
ConcurrentSkipListSet(C
Créer une nouvelle instance vide dont les éléments sont triés en utilisant l'instance de type
omparator<? super E>
Comparator fournie en paramètre
comparator)
ConcurrentSkipListSet(So Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
rtedSet<E> s) triés selon l'ordre de cette collection
La classe ConcurrentSkipListSet présente plusieurs caractéristiques :
❑ Les éléments sont ordonnés dans leur ordre naturel s'ils implémentent l'interface
Comparable ou selon un ordre défini par l'instance de type Comparator fournie au
constructeur de l'instance de la collection.
❑ Le parcours ascendant des éléments est plus rapide que le parcours descendant.
Constructeur Rôle
ConcurrentSkipListSet() Créer une nouvelle instance vide dont les éléments sont triés avec leur ordre naturel
ConcurrentSkipListSet(C Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
ollection<? extends E> c) triés avec leur ordre naturel
ConcurrentSkipListSet(C
Créer une nouvelle instance vide dont les éléments sont triés en utilisant l'instance de type
omparator<? super E>
Comparator fournie en paramètre
comparator)
ConcurrentSkipListSet(So Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
rtedSet<E> s) triés selon l'ordre de cette collection
La classe CopyOnWriteArraySet présente plusieurs caractéristiques :
❑ Les opérations de mises à jour de la collection sont coûteuses en ressources car elles
impliquent une copie intégrale des éléments du tableau
❑ Le parcours grâce à un Iterator ne peut être influencé par une opération d'un autre
thread : l'itération se fait sur une copie dédiée des éléments du tableau
Constructeur Rôle
CopyOnWriteArraySet
(Collection<? extends E> Créer une nouvelle instance contenant les éléments de la collection fournie en paramètre
c)
Le JDK contient plusieurs implémentations généralistes de l'interface Set qui peuvent
selon les besoins :
Ordre des clés Pas d'accès concurrent Gestion des accès concurrents
Aucun HashSet
ensemble.add(1);
ensemble.add(2);
ensemble.add(3);
L'unicité des éléments est garantie par la structure même de l'ensemble. Si vous essayez
d'ajouter un élément déjà présent, il ne sera pas ajouté une deuxième fois.
Pour supprimer des éléments d'un ensemble, on dispose de plusieurs méthodes, notamment
remove(Object o) et clear()
Iterator<Integer> it = ensemble.iterator();
while (it.hasNext()) {
Integer element = it.next();
System.out.println(element);
}
n
d
'
é
l
é
m
e
n
t
s
Les ensembles en Java peuvent être utilisés
de manière plus avancée pour effectuer
diverses opérations et analyses sur les
données. Voici quelques-unes des
utilisations avancées des ensembles
Les ensembles peuvent être convertis en d'autres types de collections et vice versa. Cela
peut être utile lorsque vous devez manipuler des données dans différents contextes ou avec
différentes structures de données.
ensemble.add("Java");
ensemble.add("Python");
ensemble.add("C++");
liste.add("Java");
liste.add("Python");
liste.add("C++");
ensemble.add(1);
ensemble.add(2);
ensemble.add(3);
ensemble.add(4);
Intersection (éléments communs) : Les éléments présents dans les deux ensembles.