Java Collection
Java Collection
Introduction
Les collections en Java sont des structures de données permettant de stocker et de manipuler
des groupes d'objets de manière efficace. Ce cours fournit un aperçu détaillé des collections, de
leur hiérarchie, des complexités, de la constitution interne, ainsi que du fonctionnement
spécifique des méthodes equals et hashCode , des interfaces Comparable et Comparator , et
des différentes méthodes de lecture des données dans les collections.
Collection
/ | \
/ | \
List Set Queue
/ \ | |
ArrayList HashSet LinkedList
LinkedList TreeSet PriorityQueue
2.1 ArrayList
• Structure Interne: Tableau dynamique.
• Principe: Un ArrayList est basé sur un tableau redimensionnable. Lorsque le
tableau est plein, sa taille est doublée pour accueillir plus d'éléments.
• Complexités:
◦ Accès (get): O(1) - Accès direct à l'élément via son index.
◦ Ajout (add): O(1) en moyenne, O(n) dans le pire des cas (lors du
redimensionnement).
◦ Suppression (remove): O(n) - Tous les éléments après l'élément
supprimé doivent être décalés.
• Usage Pratique:
◦ Quand utiliser ArrayList : Utilisez un ArrayList lorsque vous avez
besoin d'une collection dynamique d'éléments où les opérations d'accès
et de mise à jour sont fréquentes. Par exemple, dans un programme de
gestion d'inventaire où vous ajoutez et modifiez souvent des articles.
• Exemple d'utilisation:
import java.util.ArrayList;
import java.util.Collections;
// Tri de la liste
Collections.sort(list);
System.out.println("Sorted ArrayList: " + list);
list.remove("Python");
System.out.println("After removal: " + list);
System.out.println("Using iterator:");
var iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
import java.util.ArrayList;
import java.util.Collections;
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // Tri par âge
}
@Override
public String toString() {
return name + ": " + age;
}
@Override
public String toString() {
return name + ": " + age;
}
2.2 LinkedList
• Structure Interne: Liste doublement chaînée.
• Principe: Chaque élément est un nœud contenant une référence au nœud suivant et
précédent.
• Complexités:
◦ Accès (get): O(n) - La liste doit être traversée jusqu'à l'élément
souhaité.
◦ Ajout (add): O(1) pour ajout en tête ou en queue.
◦ Suppression (remove): O(1) si la position est connue, sinon O(n) .
• Usage Pratique:
◦ Quand utiliser LinkedList : Utilisez LinkedList lorsque vous avez
besoin de manipuler fréquemment les éléments au début ou au milieu de
la collection, par exemple dans la gestion d'une file d'attente où les
éléments sont fréquemment ajoutés ou supprimés en début de liste.
• Exemple d'utilisation:
import java.util.LinkedList;
list.remove("Python");
System.out.println("After removal: " + list);
System.out.println("Using iterator:");
var iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
2.3 HashSet
• Structure Interne: Table de hachage.
• Principe: Les éléments sont stockés dans des "seaux" en fonction de la valeur de
leur code de hachage. Les éléments dupliqués sont rejetés.
• Complexités:
◦ **Ajout (
add)**: O(1) en moyenne, O(n) dans le pire des cas (collision de hachage).
import java.util.HashSet;
System.out.println("Using iterator:");
var iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
• equals et hashCode : Ces méthodes sont cruciales pour le fonctionnement d’un
HashSet . Lorsqu'un objet est ajouté à un HashSet , Java utilise d'abord la méthode
hashCode pour déterminer le seau où placer l'objet. Ensuite, la méthode equals
est utilisée pour vérifier si l'objet est déjà présent dans le seau. Il est important de
redéfinir equals et hashCode de manière cohérente.
• Comparable et Comparator: Non applicable directement pour HashSet , car ce
dernier ne maintient pas d'ordre parmi ses éléments.
2.4 TreeSet
• Structure Interne: Arbre rouge-noir (Red-Black Tree).
• Principe: Les éléments sont stockés de manière triée en utilisant un arbre auto-
équilibré.
• Complexités:
◦ Ajout (add): O(log n)
◦ Suppression (remove): O(log n)
◦ Recherche (contains): O(log n)
• Usage Pratique:
◦ Quand utiliser TreeSet : Utilisez TreeSet lorsque vous avez besoin
d'une collection unique d'éléments triés. Par exemple, pour stocker des
enregistrements de transactions classées par date.
• Exemple d'utilisation:
import java.util.TreeSet;
System.out.println("Using iterator:");
var iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
• equals et hashCode : Ces méthodes ne sont pas utilisées dans TreeSet pour la
comparaison des éléments. TreeSet se base sur compareTo (de l'interface
Comparable ) ou sur un Comparator pour ordonner les éléments.
• Comparable et Comparator:
◦ Comparable: Les objets dans un TreeSet doivent implémenter
Comparable s’ils doivent être triés par leur ordre naturel.
◦ Comparator: Si un ordre spécifique est requis, un Comparator peut
être utilisé pour créer le TreeSet .
2.5 HashMap
• Structure Interne: Table de hachage.
• Principe: Les paires clé-valeur sont stockées dans des seaux en fonction du
hachage de la clé. Lorsque plusieurs clés ont le même hachage (collision), les
valeurs sont stockées dans une liste chaînée ou dans un arbre binaire si la liste
devient trop longue.
• Complexités:
◦ Ajout (put): O(1) en moyenne, O(n) dans le pire des cas.
◦ Suppression (remove): O(1) en moyenne.
◦ Recherche (get): O(1) en moyenne.
• Usage Pratique:
◦ Quand utiliser HashMap : Utilisez HashMap lorsque vous avez besoin
de stocker des paires clé-valeur avec un accès rapide à la valeur basée
sur une clé. Par exemple, pour stocker des configurations où les noms
des paramètres sont les clés et les valeurs des paramètres sont les
valeurs.
• Exemple d'utilisation:
import java.util.HashMap;
----------------------|--------------------------|--------------------------------|
| ArrayList | Tableau dynamique | O(1) | O(1) ou O(n) | O(n) | Utilisé pour comparaison |
Utilisés pour tri |
| LinkedList | Liste doublement chaînée | O(n) | O(1) | O(1) ou O(n) | Utilisé pour
comparaison | Utilisés pour tri |
| HashSet | Table de hachage | O(1) | O(1) | O(1) | Essentiel pour le fonctionnement | Non
applicable |
| TreeSet | Arbre rouge-noir | O(log n) | O(log n) | O(log n) | Non utilisé | Essentiel pour le
fonctionnement |
| HashMap | Table de hachage | O(1) | O(1) | O(1) | Essentiel pour le fonctionnement | Non
applicable |
| TreeMap | Arbre rouge-noir | O(log n) | O(log n) | O(log n) | Non utilisé | Essentiel pour
le fonctionnement |