23. Opérations Partagées des Collections & Égalité
Table des matières
- 23.1 Méthodes Fondamentales des Collections Disponibles pour la Majorité des Collections
- 23.2 Égalité
- 23.3 Comportement Fail-Fast
- 23.4 Opérations Bulk
- 23.5 Types de Retour et Exceptions Courantes
- 23.6 Tableau de Synthèse — Opérations Partagées
Ce chapitre couvre les opérations fondamentales partagées dans toute la Java Collections API, y compris la manière dont l’égalité est déterminée à l’intérieur des collections.
Ces concepts s’appliquent à toutes les principales familles de collections basées sur Collection
Map partage plusieurs comportements conceptuels (itération, égalité) mais n’hérite pas de Collection.
Maîtriser ces opérations est essentiel, car elles expliquent comment les collections se comportent lors de l’ajout, de la recherche, de la suppression, de la comparaison, de l’itération et du tri des éléments.
23.1 Méthodes Fondamentales des Collections (Disponibles pour la Majorité des Collections)
Les méthodes suivantes proviennent de l’interface Collection<E> et sont héritées par toutes les principales collections à l’exception de Map (qui possède sa propre famille d’opérations).
Note
Map n’implémente pas Collection, mais ses vues keySet(), values() et entrySet() l’implémentent, et exposent donc ces opérations partagées.
23.1.1 Opérations de Mutation
boolean add(E e)— Ajoute un élément (les listes autorisent les doublons).boolean remove(Object o)— Supprime le premier élément correspondant.void clear()— Supprime tous les éléments.boolean addAll(Collection<? extends E> c)— Insertion bulk.boolean removeAll(Collection<?> c)— Supprime tous les éléments contenus dans la collection fournie.boolean retainAll(Collection<?> c)— Conserve uniquement les éléments correspondants.
23.1.2 Opérations de Requête
int size()— Nombre d’éléments.boolean isEmpty()— Indique si la collection contient zéro élément.boolean contains(Object o)— S’appuie sur les règles d’égalité des éléments.Iterator<E> iterator()— Retourne un itérateur (fail-fast).Object[] toArray()et<T> T[] toArray(T[] a)— Copie dans un tableau.
23.2 Égalité
Une implémentation personnalisée de la méthode equals() permet de comparer le type et le contenu de deux collections.
L’implémentation diffère selon que l’on traite des List ou des Set.
- Exemple
List<Integer> firstList = List.of(10, 11, 22);
List<Integer> secondList = List.of(10, 11, 22);
List<Integer> thirdList = List.of(22, 11, 10);
System.out.println("firstList.equals(secondList): " + firstList.equals(secondList));
System.out.println("secondList.equals(thirdList): " + secondList.equals(thirdList));
Set<Integer> firstSet = Set.of(10, 11, 22);
Set<Integer> secondSet = Set.of(10, 11, 22);
Set<Integer> thirdSet = Set.of(22, 11, 10);
System.out.println("firstSet.equals(secondSet): " + firstSet.equals(secondSet));
System.out.println("secondSet.equals(thirdSet): " + secondSet.equals(thirdSet));
Sortie
firstList.equals(secondList): true
secondList.equals(thirdList): false
firstSet.equals(secondSet): true
secondSet.equals(thirdSet): true
Note
- Les List comparent la taille, l’ordre et l’égalité des éléments un par un.
- Les Set comparent uniquement la taille et l’appartenance — l’ordre de parcours est sans importance.
- Deux sets contenant les mêmes éléments logiques sont égaux même s’ils maintiennent des ordres d’itération internes différents.
23.3 Comportement Fail-Fast
La plupart des itérateurs de collections (à l’exception des collections concurrentes) sont fail-fast : modifier structurellement une collection pendant l’itération déclenche une ConcurrentModificationException.
List<Integer> list = new ArrayList<>(List.of(1,2,3));
for (Integer i : list) {
list.add(99); // ❌ ConcurrentModificationException
}
Note
Utilisez Iterator.remove() lorsque vous devez supprimer des éléments pendant l’itération.
Le comportement fail-fast n’est pas garanti — l’exception est levée selon un principe de best-effort.
Vous ne devez pas compter sur sa capture pour assurer la correction du programme.
23.4 Opérations Bulk
removeIf(Predicate<? super E> filter)— Supprime tous les éléments correspondants.replaceAll(UnaryOperator<E> op)— Remplace chaque élément.forEach(Consumer<? super E> action)— Applique une action à chaque élément.stream()— Retourne un stream pour les opérations de pipeline.
23.5 Types de Retour et Exceptions Courantes
add(E)retourne boolean — toujourstruepourArrayList, peut êtrefalsepour lesSetsi aucune modification n’a lieu.remove(Object)retourne boolean (pas l’élément supprimé).get(int)lèveIndexOutOfBoundsException.iterator().remove()lèveIllegalStateExceptions’il est appelé deux fois sansnext().toArray()retourne toujours unObject[]— jamais unT[].
23.6 Tableau de Synthèse — Opérations Partagées
| Opération | S’applique à | Notes |
|---|---|---|
add(e) |
Toutes les collections sauf Map | Les List autorisent les doublons |
remove(o) |
Toutes les collections sauf Map | Supprime la première occurrence |
contains(o) |
Toutes les collections sauf Map | Utilise equals() |
size(), isEmpty() |
Toutes les collections | Temps constant pour la majorité |
iterator() |
Toutes les collections | Fail-fast |
clear() |
Toutes les collections | Supprime tous les éléments |
stream() |
Toutes les collections | Retourne un stream séquentiel |
removeIf(), replaceAll() |
List uniquement (la plupart des Set ne supportent pas replaceAll) | Opérations bulk |
toArray() |
Toutes les collections | Retourne Object[] |